Redis: Remote Dictionary Service , 远程字典服务,Redis是一个键值数据库,其中Key都是字符串的形式,Value分别支持string、list、set、hash以及zset。

一、string

string是redis最常用的数据结构,通常系统缓存在redis的业务数据,大多都是以string的方式存放到redis,比如应用信息,可以把从数据库查询到的应用信息转换成json,然后存放到redis。

string数据在redis实际上是以simple dynamic string(SDS)的数据结构存储的,最终string内容存储的形式为数组。

对于string数据的常用操作如下:

127.0.0.1:6379> set name zhangsan   # 设置name=zhangsan
OK
127.0.0.1:6379> get name # 获取name的值
"zhangsan"
127.0.0.1:6379> expire name 1 # 设置name的过期时间为1秒
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setex name 2 zhangsan # 相当于set + expire ,2秒后过期
OK
127.0.0.1:6379> get name  # 两秒后...
(nil)
127.0.0.1:6379> setnx name zhangsan # 当name不存在时,设置name=zhangsan
(integer) 1 # 表示成功
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> setnx name zhangsan
(integer) 0 # 表示失败

二、list

list通常用于异步队列,类似于消息中间件,消息生产者将消息存入redis的list队列,消息消费者从redis中消费list数据库,list底层数据结构为链表。
redis01

对于list的常用操作如下:

127.0.0.1:6379> lpush books java # 从list左边(头部)插入数据,如果list不存在则创建,然后再插入数据。
(integer) 1
127.0.0.1:6379> lindex books 0 # 读取list的第一个数据
"java"
127.0.0.1:6379> lpush books golang
(integer) 2
127.0.0.1:6379> lindex books 0
"golang"
127.0.0.1:6379> llen books # 查看books的长度
(integer) 2
127.0.0.1:6379> lpop books # 从books左边(头部)取出一个数据
"golang"
127.0.0.1:6379> lindex books 0
"java"
127.0.0.1:6379> rpush books c++ # 从books右边(尾部)插入数据
(integer) 2
127.0.0.1:6379> lindex books 0
"java"
127.0.0.1:6379> rpush books reactjs
(integer) 3
127.0.0.1:6379> lindex books 0
"java"
127.0.0.1:6379> llen books
(integer) 3
127.0.0.1:6379> lindex books -1 # 读取books最后一个数据库
"reactjs"
127.0.0.1:6379> rpop books # 从books右边(尾部)取出一个数据
"reactjs"
127.0.0.1:6379> lindex books -1
"c++"
127.0.0.1:6379> llen books
(integer) 2 
127.0.0.1:6379> lrange books 0 -1 # 遍历books所有数据
1) "java"
2) "c++"
127.0.0.1:6379> ltrim books 1 0 # 清空books所有数据
OK
127.0.0.1:6379> llen books
(integer) 0

三、hash

hash数据结构通常用于存储对象,不同于string+json的存储方式,string+json方式存储的对象信息为不经常变化的数据,比如对于云通信平台的一键登录应用信息,这些信息创建完成后就基本上不会再发生变化。而对于hash来说,存储的通常是其中一部分需要经常变化的信息,比如商品信息,商品名称、描述等变化较少,而商品的销量、评价数、关注数等变化较多,对于这种缓存数据,用hash的方式存储,比较灵活,只需要更新其中变化的属性值即可。hash的数据结构与java的HashMap类似。

对于hash的常用操作如下:

127.0.0.1:6379> hset books java "thinking in java" # 给books增加 java=thinking in java,如果books不存在则创建,value值如果有空格,需要用双引号括起来
(integer) 1
127.0.0.1:6379> hmset books c++ "thinking in c++" reactJS "think in reactJS" # 批量添加
OK
127.0.0.1:6379> hget books java # 读取books的java值
"thinking in java"
127.0.0.1:6379> hgetall books # 读取books的所有键值对数据
1) "java"
2) "thinking in java"
3) "c++"
4) "thinking in c++"
5) "reactJS"
6) "think in reactJS"
127.0.0.1:6379> hdel books reactJS # 删除books的reactJS键值对
(integer) 1
127.0.0.1:6379> hgetall books 
1) "java"
2) "thinking in java"
3) "c++"
4) "thinking in c++"
127.0.0.1:6379> hlen books # 获取books的长度
(integer) 2
127.0.0.1:6379> hmget books java c++ # 批量获取books的 java c++值
1) "thinking in java"
2) "thinking in c++"
127.0.0.1:6379> hvals books # 读取books所有键的值
1) "thinking in java"
2) "thinking in c++"
127.0.0.1:6379> hsetnx books react "think in react" # 如果books不存在react,则添加,否则不添加
(integer) 1
127.0.0.1:6379> hsetnx books react "think in react"
(integer) 0

四、set

set数据结构通常用于存储不允许重复的数据,比如活动中奖用户ID、黑白名单、标签等等。set的数据结构与java的HashSet类似。

对于set的常见操作如下:

127.0.0.1:6379> sadd books java # 往books添加java,如果books不存在则创建books
(integer) 1
127.0.0.1:6379> sadd books java # books中已经存在java,因此添加不成功
(integer) 0
127.0.0.1:6379> sadd books c++ golang # 批量添加
(integer) 2
127.0.0.1:6379> smembers books # 读取books所有项
1) "java"
2) "golang"
3) "c++"
127.0.0.1:6379> sismember books react # 判断books中是否存在react
(integer) 0
127.0.0.1:6379> sismember books java
(integer) 1
127.0.0.1:6379> scard books # 获取books的长度
(integer) 3
127.0.0.1:6379> spop books  # 弹出books其中一项
"c++"
127.0.0.1:6379> smembers books
1) "java"
2) "golang"

五、zset

zset为有序集合,在set的基础上增加了排序功能,通常用于排行榜、延时队列等。底层数据结构为跳跃列表,如下图所示,L0为所有数据,L1是在L0基础上提取的一部分数据,L2是在L1基础上提取的一部分数据,以此类推,最高层为31。redis采用该数据结构主要是解决查找问题,因此链表的查询为O(n),这是不可接受了,因此通过不同的层级查找,来快速定位。
redis02

zset的常见操作如下:

127.0.0.1:6379> zadd books 9.0 java # 往books添加java,并设置分数
(integer) 1
127.0.0.1:6379> zadd books 8.5 c++
(integer) 1
127.0.0.1:6379> zadd books 8.0 golang
(integer) 1
127.0.0.1:6379> zrange books 0 -1 # 升序查询所有数据项
1) "golang"
2) "c++"
3) "java"
127.0.0.1:6379> zrevrange books 0 -1 # 降序查询所有数据项
1) "java"
2) "c++"
3) "golang"
127.0.0.1:6379> zrank books golang # 查询golang的排名
(integer) 0
127.0.0.1:6379> zrangebyscore books 8.0  8.9  # 按分数范围查询
1) "golang"
2) "c++"
127.0.0.1:6379> zcard books # 查询books的数量
(integer) 3
127.0.0.1:6379> zrem books c++ # 删除c++
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "golang"
2) "java"
127.0.0.1:6379> zscore books golang # 查看golang的分数
"8.0"
打赏
支付宝 微信
上一篇 下一篇