Redis 基础数据结构

string (字符串)

是一种键值对的数据结构,定义一个惟一的key值来获取相应的value数据。java

> set name codehole
OK
> get name
"codehole"
> exists name
(integer) 1
> del name
(integer) 1
> get name
(nil)

批量操做
> set name1 codehole
OK
> set name2 holycoder
OK
> mget name1 name2 name3 # 返回一个列表
1) "codehole"
2) "holycoder"
3) (nil)
> mset name1 boy name2 girl name3 unknown
> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknown"

能够对 key 设置过时时间,到点自动删除,这个功能经常使用来控制缓存的失效时间。python

> set name codehole
> get name
"codehole"
> expire name 5  # 5s 后过时
...  # wait for 5s
> get name
(nil)

> setex name 5 codehole  # 5s 后过时,等价于 set+expire
> get name
"codehole"
... # wait for 5s
> get name
(nil)

> setnx name codehole  # 若是 name 不存在就执行 set 建立
(integer) 1
> get name
"codehole"
> setnx name holycoder
(integer) 0  # 由于 name 已经存在,因此 set 建立不成功
> get name
"codehole"  # 没有改变

若是 value 值是一个整数,还能够对它进行自增操做golang

> set age 30
OK
> incr age
(integer) 31
> incrby age 5
(integer) 36
> incrby age -5
(integer) 31

list(列表)

至关于java里面的LinkedLis,意味着list的插入和删除很是快,可是索引定位很慢。redis

右边进左边出:队列数组

> rpush books python java golang
(integer) 3
> llen books
(integer) 3
> lpop books
"python"
> lpop books
"java"
> lpop books
"golang"
> lpop books
(nil)

右边进右边出:栈缓存

> rpush books python java golang
(integer) 3
> rpop books
"golang"
> rpop books
"java"
> rpop books
"python"
> rpop books
(nil)

lindex,lrange,ltrim
lindex至关于java链表的get(int index)方法,性能随着参数index增大而变差
lrange是获取范围内的数据
ltrim是保留这个list范围里面的数据,范围外的丢弃数据结构

> rpush books python java golang
(integer) 3
> lindex books 1  # O(n) 慎用
"java"
> lrange books 0 -1  # 获取全部元素,O(n) 慎用
1) "python"
2) "java"
3) "golang"
> ltrim books 1 -1 # O(n) 慎用
OK
> lrange books 0 -1
1) "java"
2) "golang"
> ltrim books 1 0 # 这实际上是清空了整个列表,由于区间范围长度为负
OK
> llen books
(integer) 0

hash(字典)
这个数据结构至关于java里面的HashMap,它是无序的。内部实现是使用了数组+链表二维结构。若是发生hash碰撞的时候,就会将碰撞的元素使用链表串接起来。而且redis的字典的vlaue值只能是字符串。性能

redis的字典在rehash的时候采用了渐进式策略,在rehash同时,会保留两个新旧hash结构,查询时会同时查询两个hash结构,而后再后续的定时任务中以及hash操做指令中,按部就班地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。命令行

> hset books java "think in java"  # 命令行的字符串若是包含空格,要用引号括起来
(integer) 1
> hset books golang "concurrency in go"
(integer) 1
> hset books python "python cookbook"
(integer) 1
> hgetall books  # entries(),key 和 value 间隔出现
1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
> hlen books
(integer) 3
> hget books java
"think in java"
> hset books golang "learning go programming"  # 由于是更新操做,因此返回 0
(integer) 0
> hget books golang
"learning go programming"
> hmset books java "effective java" python "learning python" golang "modern golang programming"  # 批量 set
OK

set (集合)

它内部的键值对是无序的惟一的。它的内部实现至关于一个特殊的字典,字典中全部的 value 都是一个值NULL。code

> sadd books python
(integer) 1
> sadd books python  #  重复
(integer) 0
> sadd books java golang
(integer) 2
> smembers books  # 注意顺序,和插入的并不一致,由于 set 是无序的
1) "java"
2) "python"
3) "golang"
> sismember books java  # 查询某个 value 是否存在,至关于 contains(o)
(integer) 1
> sismember books rust
(integer) 0
> scard books  # 获取长度至关于 count()
(integer) 3
> spop books  # 弹出一个
"java"

zset (有序集合)

一方面它是一个 set,保证了内部 value 的惟一性,另外一方面它能够给每一个 value 赋予一个 score,表明这个 value 的排序权重。它的内部实现用的是一种叫作「跳跃列表」的数据结构。

> zadd books 9.0 "think in java"
(integer) 1
> zadd books 8.9 "java concurrency"
(integer) 1
> zadd books 8.6 "java cookbook"
(integer) 1
> zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围
1) "java cookbook"
2) "java concurrency"
3) "think in java"
> zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围
1) "think in java"
2) "java concurrency"
3) "java cookbook"
> zcard books  # 至关于 count()
(integer) 3
> zscore books "java concurrency"  # 获取指定 value 的 score
"8.9000000000000004"  # 内部 score 使用 double 类型进行存储,因此存在小数点精度问题
> zrank books "java concurrency"  # 排名
(integer) 1
> zrangebyscore books 0 8.91  # 根据分值区间遍历 zset
1) "java cookbook"
2) "java concurrency"
> zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 表明 infinite,无穷大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
> zrem books "java concurrency"  # 删除 value
(integer) 1
> zrange books 0 -1
1) "java cookbook"
2) "think in java"
相关文章
相关标签/搜索