redis五种数据类型及应用场景

String
常用命令:get、set、incr、decr、mget等。
redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
注意:一个键最大能存储512MB。
Hash
常用命令:hget,hset,hgetall 等。
应用场景:比如我们要存储一个用户信息对象数据
每个 hash 可以存储 232 -1 键值对(40多亿)。
List
lpush(添加左边元素),rpush,lpop(移除左边第一个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等。
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
使用场景:

  1. 消息队列系统

消息队列系统:使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。比如:将Redis用作日志收集器,实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。

  1. 获取最新N个数据
    取最新N个数据的操作:记录前N个最新登陆的用户Id列表,超出的范围可以从数据库中获得。
    //把当前登录人添加到链表里
    ret = r.lpush(“login:last_login_times”, uid)
    //保持链表只有N位
    ret = redis.ltrim(“login:last_login_times”, 0, N-1)
    //获得前N个最新登陆的用户Id列表
    last_login_list = r.lrange(“login:last_login_times”, 0, N-1)

  2. 比如微博:
      在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。但是我们做了限制不能超过5000个ID,因此我们的获取ID函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。我们的系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
    redis 127.0.0.1:6379> lpush runoob redis
    (integer) 1
    redis 127.0.0.1:6379> lpush runoob mongodb
    (integer) 2
    redis 127.0.0.1:6379> lpush runoob rabitmq
    (integer) 3
    redis 127.0.0.1:6379> lrange runoob 0 10

  1. “rabitmq”
  2. “mongodb”
  3. “redis”
    redis 127.0.0.1:6379>
    Set
    是string类型的无序集合。集合是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。
    常用命令:sadd,spop,smembers,sunion 等。
    实现方式: set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
    使用场景:
      ①交集,并集,差集:(Set)
    //book表存储book名称
    set book:1:name ”The Ruby Programming Language”
    set book:2:name ”Ruby on rail”
    set book:3:name ”Programming Erlang”
    //tag表使用集合来存储数据,因为集合擅长求交集、并集
    sadd tag:ruby 1
    sadd tag:ruby 2
    sadd tag:web 2
    sadd tag:erlang 3
    //即属于ruby又属于web的书?
    inter_list = redis.sinter(“tag.web”, “tag:ruby”)
    //即属于ruby,但不属于web的书?
    inter_list = redis.sdiff(“tag.ruby”, “tag:web”)
    //属于ruby和属于web的书的合集?
    inter_list = redis.sunion(“tag.ruby”, “tag:web”)

Zset
和 set 一样也是string类型元素的集合,且不允许重复的成员。
常用命令:zadd,zrange,zrem,zcard等

比如一个存储全班同学成绩的Sorted Set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值