redis实际上是一个数据结构服务器,支持不同类型的值。传统的key-value存储中,String类型key关联String类型值;在redis中value的类型不局限于简单的String类型,还可以是一些复杂的数据结构,下面是redis支持的数据结构:
- Binary-safe strings
- Lists:String类型元素的集合,按照插入顺序排序,基本上是链表
- Sets: 唯一的,无序的String类型元素的集合
- Sorted sets: 和 sets类似,但是每个元素关联一个浮点类型的分数。元素通过分数来进行排序的,可以根据分数进行范围查询
- Hashes: 类似python里面的hashes,key value都是字符串
- Bit arrays:
- HyperLogLogs:通过概率的方式估计set的基数
- Streams:
Redis Keys
redis keys 可以是任何二进制序列,如字符串"foo" 或者jpeg文件内容.空字符串也是一个有效的key.
redis key的几个规则:
- keys 不要太长,因为内存 和 key查找比较的消耗;可以用hash例如(SHA1)方式.
- keys 也不要太短,要保证易读性,如"u1000flw" ,“user:1000:followers” 后面易读 也没增加多少消耗
- 试着用一些schema;如"object-type:id" “user:1000”. '.'和‘-’常用于多个单词的字段,如"comment : 1234:reply.to",“comment : 1234:reply-to”.
- 最大允许key的大小是512MB.
Redis Strings
基本操作:
> set mykey somevalue
OK
> get mykey
"somevalue"
> set mykey newval nx
(nil)
>set mykey newval xx
OK
> set counter 100
OK
>incr counter
(integer) 101
>incrby counter 50
(integer) 151
- value 不能大于512MB
- getset
- mset
- mget
- exists
- del
- type
Redis expires: keys with limited time to live
秒单位 可以是毫秒PEXPIRE PTTL
> set key some-value
OK
> expire key 5
(integer) 1
> get key
"some-value"
> get key (after some time)
(nil)
> set key 100 ex 10
OK
> ttl key
(integer) 9
Redis Lists
Redis lists are implemented via Linked Lists.
基本操作:
> rpush mylist A
(integer) 1
>rpush mylist B
(integer) 2
> lrange mylist 0 -1
1) "A"
2) "B"
>rpop mylist
"B"
>rpop mylist
"A"
>rpop mylist
(nil)
Lists 常见使用场景
- 记住社交用户最近的更新
- 进程间的交互,consumer-producer
假设你的首页展示最近发布的图片,你想要加速访问:
1.每次用户上传图片的时候,lpush ids into a list.
2.当用户访问首页的时候使用lrange 0 9
Capped lists:
许多场景下我们只想用lists取存最新的items;
LTRIM command 可以只记住最近的N个丢弃老的。