Redis 基础数据结构


String 

动态字符串,类似arraylist,当字符串长度消息1M时,扩容是加倍现有空间,超过1M,扩容时会多扩1M空间,字符串长度最大为512M


Redis原理 -基础数据结构_java

redis-cli -h 172.31.1.135 -c -p 7000

使用set,get命令进行操作


Redis原理 -基础数据结构_链表_02


判断key是否存在

exists key

Redis原理 -基础数据结构_java_03

删除key

del name

Redis原理 -基础数据结构_java_04

设置key的有效时间


set name codehole

expire name 5  # 5s 后过期


Redis原理 -基础数据结构_redis_05


setex name 5 codehole  # 5s 后过期,等价于 set+expire

wait for  5 seconds

get name

Redis原理 -基础数据结构_java_06


setnx name codehole  # 如果 name 不存在就执行 set 创建

有返回值,返回值为1 表示创建成功 为0 创建失败

Redis原理 -基础数据结构_java_07

再次setnx命令,返回 0

setnx name java  



Redis原理 -基础数据结构_链表_08


使用redis进行计数

set age 30

incr age

Redis原理 -基础数据结构_链表_09

还可以使用incrby 进行+/-计算

Redis原理 -基础数据结构_java_10


但是redis自增是有一定的范围的 signed long

set codehole 9223372036854775807


Redis原理 -基础数据结构_链表_11

批量set get

mset name1 boy name2 girl name3 unknown

mget name1 name2 name3

Redis原理 -基础数据结构_链表_12

如果不在一个slot上会报错的

Redis原理 -基础数据结构_java_13



列表

相当于java里面的linkedlist,链表的插入和删除非常快,复杂度O(1), 索引定位慢,时间复杂度为O(n)

Redis原理 -基础数据结构_链表_14

使用场景

Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理

右边进左边出:队列

rpush books python java golang

llen  books #列表长度

lpop books #弹出列表第一个

Redis原理 -基础数据结构_链表_15



右边进右边出:栈

rpush books python java golang

rpop books

Redis原理 -基础数据结构_链表_16


Hash字典

相当于java中的hashmap,无序的,同样采用 数组+链表的二维结构,但是redis,扩容方式不一样, redis采用了渐进性rehash策略,新旧hash结构,循环渐进性的一点点迁移,当迁移完后,旧hash删除,内存回收

Redis原理 -基础数据结构_链表_17


Redis和hashmap的扩容不有的地方是采用了渐进式hash,渐进性的一点点迁移

Redis原理 -基础数据结构_java_18


hash 移除了最后一个元素,数据结构会被删除

Redis原理 -基础数据结构_java_19


hash 结构的存储消耗要高于单个字符串

hset mapneme key value

hgetall mapname

hget  mapname key

Redis原理 -基础数据结构_java_20

也有批量set

hmset books java "effective java" python "learning python" golang "modern golang programming"


set集合

相当于Java中的hashset,内部键值对是无序的唯一的,内部实现相当于一个特殊的字典,字典中所有value都是一个值NULL

Redis原理 -基础数据结构_redis_21

sadd books python

sadd books java golang

smembers books

Redis原理 -基础数据结构_链表_22


zset集合 

java中sortedSet和HashMap的结合体,一方面是一个set,保证value的唯一性,另外一方面,可以给每个value赋值一个score,代码这个value的排序权重,内部实现是一个类似,跳跃列表的 数据结构

zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

Redis原理 -基础数据结构_java_23

zadd books 9.0 "think in java"

zadd books 8.9 "java concurrency"

zadd books 8.6 "java cookbook"

zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围

zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围

Redis原理 -基础数据结构_redis_24


跳跃列表其实采用的是一个二分查找的一个方式

Redis原理 -基础数据结构_链表_25

我们需要这个链表按照 score 值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办? 想想一个创业公司,刚开始只有几个人,团队成员之间人人平等,都是联合创始人。随着公司的成长,人数渐渐变多,团队沟通成本随之增加。这时候就会引入组长制,对团队进行划分。每个团队会有一个组长。开会的时候分团队进行,多个组长之间还会有自己的会议安排。公司规模进一步扩展,需要再增加一个层级 —— 部门,每个部门会从组长列表中推选出一个代表来作为部长。部长们之间还会有自己的高层会议安排。

Redis原理 -基础数据结构_java_26


过期时间

ttl 可以查看key的过期时间

Redis原理 -基础数据结构_java_27