redis中数据结构
redis中的value有五种不同的数据结构
string字符串
最简单的Redis类型,通过set key value 或者 get key 来操作此类数据,值可以是任务种类的字符串(包括二进制数据),可以保持一个图片的二进制流,但是最大长度不能超过512MB
list
Redis lists是基于Linked Lists实现,链表上每个节点都包含了一个字符串,使用lpush在十个元素的list头部和百万个元素的list头部添加新元素速度是相同的,但是查询效率就相当差了。
lpush在list的左边(头部)添加一个新元素,rpush在list的右边(尾部)添加一个新元素;
lpop弹出list的左边第一个元素,rpop在list右边弹出一个元素;
lrange范围打印list中的值。(实际应用中可以获得最近关注的人)
可以使用list来实现生产者和消费者模型,如果使用lpush和rpop来实现该功能,若list是空,这时候消费者就需要轮询来获取数据,这样就会增加redis访问压力、增加消费端的cpu时间,而很多访问都是无用的。为此redis提供了阻塞式访问blpop和brpop, 消费者可以在获取数据时指定如果数据不存在阻塞的时间,如果在时限内获得数据则立即返回,如果超时还没有数据则返回null。timeout参数为0表示一直阻塞。
set
Redis Set 是String的无序排列
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
scard key 返回 key的基数,就是key对应的value有多少元素
sinner key1 key2 求集合key1和key2的交集(例如微博的共同好友)
sunion求并集,sdiff求差集(不同元素)
smember 返回key集合中所有元素
sismember 是否存在key的元素(1存在,0不存在)
sorted set
Redis有序集合和集合一样,是string类型元素集合,且不允许重复,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中成员进行从小到大的排序,成员唯一但分数可以重复。
zadd key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
zcardkey
获取有序集合的成员数
zrange key 0 2 按从小到大的顺序取前三(排行榜的排名)
zrevrange key 0 2 按从大到小的顺序取
hash
Redis中的hash类型的value可以看成map容器,可以用来保存用户的信息,key为user1,value中包含了username、password、age等键值对。每个hash可以储存 232 - 1 个键值对。
同样是缓存,在Memcached中,我们经常将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。
hset key field 获取存储在哈希表中指定字段的值
hgetall key 获取在哈希表中指定 key 的所有字段和值
hexists key field 查看哈希表 key 中,指定的字段是否存在