Redis是什么
Redis(Remote Dictionary Service)互联网技术领域使用最广泛的键值对存储中间件
Redis(基于docker)的安装
docker pull redis
docker run --name redisdemo -d -p6379:6379 redis
docker exec -it redisdemo redis-cli
Redis的五种基础数据结构
Redis有五种基础数据结构:string(字符串),list(列表),hash(字典),set(集合),zset(有序集合)
string(字符串)
redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key值获取响应的value。不同类型的数据结构差异就在于value的结构不一样。
字符串一个常见用途就是缓存用户信息,将用户信息体使用JSON序列化成字符串。
redis的字符串时动态字符串,内部结构实现类似于arraylist,通过预分配冗余空间减少内存的频繁分配。若字符串少于1M,扩容和hashmap一样是2倍扩容,当超过1M,一次只会多扩容1M,字符串最大长度时512MB。
单个string值添加与查询
>set test curry
OK
>get test
"curry"
批量string值添加与查询
>mset player1 curry player2 "kelvin durant"
>mget player1 player2
1) "curry"
2) "kelvin durant"
setex和setnx
setex用于设置过期时间;setnx用于不存在就设置,已经存在就创建不成功
以上两个操作在分布式环境下,需要同时执行保证原子操作
计数
假如value是整数,可以使用incr进行自增,范围是sign long的最大值和最小值
>set number 1
OK
>incr number
(integer) 2
>incrby number 10
(integer) 12
位图
字符串有多个字节,一个字节有8个bit,由此组成bitmap(位图)
list
类似于LinkedList,因为是链表,所以插入删除时间复杂度只有O(1),同样的,索引定位很慢,是O(n)。而且是双向链表,所以支持前后遍历。
使用list作为队列
队列时先进先出,可以确保访问顺序,因此可以用于消息排队和异步逻辑处理。
>rpush players curry durant james
(integer) 3
>llen players
(integer) 3
>lpop players
"curry"
>lpop players
"durant"
>lpop players
"james"
>lpop players
(nil)
查询list的全部元素
>rpush players curry durant james
OK
>lrange players 0 -1
1) "curry"
2) "durant"
3) "james"
list的底层结构
在redis中,list实际上是以ziplist或者quicklist的结构存储。
当list元素比较少,只会使用一块连续的内存存储,元素之间互相紧贴,这个叫ziplist;
当list元素比较多,就会变成链表和ziplist结合,这就是quicklist。quicklist之间ziplist以双向指针联系起来。
hash(字典)
类似于jdk1.7的hashmap,数组+链表,当产生碰撞就会使用拉链法建立链表。
常用命令:hset,hget,hgetall,hlen,hmset
set(集合)
类似于hashset,自带去重功能,常用命令:sadd,smembers,sismember,scard(用来获取长度),spop(随机取出一个)
zset(有序集合)
zset是一个set,所以可以保证value唯一性,但是每个value还有一个score代表权重,用于排序。底层是使用跳跃列表的数据结构。
>zadd players 81 Bryant
(integer) 1
>zadd players 63 McGrady
(integer) 1
>zrange players 0 -1
1) "Bryant"
2) "McGrady"
>zrevrange players 0 -1
1) "McGrady"
2) "Bryant"
<zcard players
(integer) 2
>zscore players Bryant
"81"
还有zrank获取特定value对应的排名,zrangebyscore根据score范围获取value,zrange 0 到-1来获取全部的value
跳跃列表:
最底层是所有元素出双向链表串联起来,插入时,使用扔骰子的随机方式(50%的几率)决定是否到上一层,以此类推。
list,set,hash,zset的共同点
- create if not exists,如果不存在,会自动创建
- drop if no elements,如果没有元素了,会自动删除,回收内存
过期时间注意事项
设置的过期时间到了,redis会自动删除对象。
对于hash,zset等,是整个hash,zset都会过期。
如果在已经设置过期时间,然后直接set,会令过期时间消失。