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%的几率)决定是否到上一层,以此类推。

OSS与redis区别_字符串

list,set,hash,zset的共同点

  1. create if not exists,如果不存在,会自动创建
  2. drop if no elements,如果没有元素了,会自动删除,回收内存

过期时间注意事项

设置的过期时间到了,redis会自动删除对象。

对于hash,zset等,是整个hash,zset都会过期。

如果在已经设置过期时间,然后直接set,会令过期时间消失。