redis是什么
我们来看看官方的说法,redis是一个开源的,内存
中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
- redis是工作在内存中的。相比与mysql这种将数据存储在硬盘中的数据库,redis天生就比它快
- 为什么叫数据结构存储系统?意思是说redis支持多种数据结构的存储方式,比如string、hash、list、set、sorted set、bitmap、hyperloglog、geospatial。我们可以根据实际需求选择不同的数据结构,下面我们通过简单举例阐述不同数据结构的使用场景
redis五大数据结构
redis的key值可以是简单的字符串,也可以是二进制序列。但是不建议key过长,这会影响redis查找key值的性能
下面只举例常用的redis命令,更全面的redis命令大全请到redis官网查看
string
最简单的key-value
存储结构
> set age 18
OK
> get age
"18"
redis的原子递增操作,incr和incrby本质上是同一个命令
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152
批量设值
> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"
nx
和xx
的区别,nx
表示当key不存在时,才能赋值成功,xx
表示当key已经存在时,才能赋值成功
> get age
"11112"
> set age 18 nx
(nil)
> set age 10 xx
OK
set
和mset
的区别
- set命令在一次连接中只能设置一个key-value,如果要设置多个,必须和redis连接多次
- mset允许客户端和redis的一次连接中同时设置多个值
- 如果要做批量操作,mset效率比set高
应用场景
在一个投票系统中,某个参赛者又获得了十票
> incrby user:001:ticket 10
list列表
list是一个双向链表的结构,lpush
和lpop
分别表示左插入和左弹出value值,rpush
和rpop
分别表示右插入和右弹出value值
list是有序的,value值可以重复,可以通过下标获取指定元素
应用场景
某个平台需要记录一个用户发表的文章,可以把文章的唯一ID和该用户绑定,如某用户ID为1,发布了arcticle1、arcticle2、arcticle1三篇文章,那么可以这样记录:
> lpush user:1:arcticle arctitle:1 arctitle:2 arctitle:3
至于某篇文章的具体内容可以用下述的hash来记录
hash哈希
hash很适合存储对象,比如有一张表
id | name | age | sex |
---|---|---|---|
1 | lucy | 18 | girl |
2 | tom | 20 | boy |
我们需要用hash记录lucy,我们可以这样
> hmset user:1 name lucy age 18 sex girl
当我们需要对lucy的年龄+2的时候,我们可以直接对其中的某个属性操作
> hincrby user:11 age 2
需要注意,当filed个数少,且value不大时,内部使用压缩列表ziplist编码。当value大于64字节时,内部编码为hashtable。
set集合
不允许保存重复元素、集合内元素无序、支持增删改查、集合间可以做差集、并集、交集,最多可以保存232-1个元素
集合适合用来给人、事物贴标签
。比如我要表示桌子是黑色的、方形的,凳子是黑色的,圆柱形的,最后找出这两者一样的地方(都是黑色的)
> sadd desk black square
(integer) 2
> sadd chair cylindrical black
(integer) 2
> sinter desk chair
1) "black"
sorted set有序集合
有序集合顾名思义就是集合内的元素有序。集合内每个元素都有分值(score)的概念,排序也就是根据这个分值排的
有序集合适合做需要得到排名
的场景需求,比如某场线上文章比赛,举办方通过谁的文章点赞更多,谁就能获得更高的排名
zadd user:arcticle 50 tom 10 jack 99 lucy
(integer) 3
> zrevrange user:arcticle 0 -1 withscores
1) "lucy"
2) "99"
3) "tom"
4) "50"
5) "jack"
6) "10"