List

有序的数据结构,quclikeList 双端链表 和 ziplist作为底层实现

help @list
//查看list相关帮助

zibytes: 多少数据
zltail : 尾节点位置
zllen : 链表中元素
zlend: 255 恒等与255, 标识结束
entry :
preawlen: 前一个元素的长度
是否小于254,前一个元素的大小
len:
data :

zlbytes:32bit,表示ziplist占用的字节总数。 zltail: 32bit,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数。 通过zltail我们可以很方便地找到最后一项,从而可以在ziplist尾端快速地执行push或pop操作 zlen: 16bit, 表示ziplist中数据项(entry)的个数。 entry: 表示真正存放数据的数据项,长度不定 zlend: ziplist最后1个字节,是一个结束标记,值固定等于255。 prerawlen: 前一个entry的数据长度。 len: entry中数据的长度 data: 真实数据存储

双端链表

redis.conf配置文件 list-max-ziplist-size -2 : 8kb大小,太大,搬移数据量也比较大 list-compress-depth 1 压缩几个节点 1代表从头节点往后走一个, 尾节点往前走一个不用压缩,其他的全部压缩,2,3,4 … 以此类推

image.png

image.png

Hash


底层也是dict 实现 redisDb
数据小的时候是ziplist实现

object encodeing key 查看value的类型

hash-max-ziplist-entries 512 // ziplist 元素个数超过 512 ,将改为hashtable编码 hash-max-ziplist-value 64 // 单个元素大小超过 64 byte时,将改为hashtable编码

Set结构

dict实现,无序结构

type key 查看key value类型 object encoding key :查看底层额数据结构 set-max-intset-entries 512 // intset 能存储的最大元素个数,超过则用hashtable编码

  1. typedef struct intset {
  2. uint32_t encoding;
  3. uint32_t length;
  4. int8_t contents[];
  5. } intset;
  6. #define INTSET_ENC_INT16 (sizeof(int16_t))
  7. #define INTSET_ENC_INT32 (sizeof(int32_t))
  8. #define INTSET_ENC_INT64 (sizeof(int64_t))
  9. 整数集合是一个有序的,存储整型数据的结构。整型集合在Redis
  10. 中可以保存int16_t,int32_t,int64_t类型的整型数据,并且可以保证
  11. 集合中不会出现重复数据。
  12. encoding: 编码类型
  13. length: 元素个数
  14. contents[]: 元素存储

ZSet

dict + 跳表
数据少时采用ziplist
skiplis跳表?
数据层
索引层
层高:

level:
header不存储数据,
确定层高

层高怎么确定的:
zslRandomLevel() 方法确定层高
创建跳跃表
set值的过程
1:先找索引层:从header中的level找最高的索引层
2:循环比较,如果不是层高减一向下继续比较
3: 创建节点
4:维护关联关系各个层高的管理关系
1afd315930f386a58a49e33713cbd03.png

跳表的应用:

geohash算法吧二维坐标变成可排序课比较的字符串编码
GeoHash:地理编码,地图上的应用,

geoadd location 经度 纬度 名称 添加 geodist locations 名称1 名称2 km 两地的距离单位 km georadiusbymember location 名称1 4km 名称1 4km内的地点名称

地理与跳跃表的关系?
:将区域无线划分,每个分四份,递归切分

z曲线,把经纬度转成二进制编码
有序的,
优点:GeoHash利用Z阶曲线进行编码,Z阶曲线可以将二维所有点都转换成一阶曲线。地理位置坐标点通过编码转化成一维值,利用 有序数据结构如B树、SkipList等,均可进行范围搜索。因此利用GeoHash算法查找邻近点比较快
缺点:Z 阶曲线有一个比较严重的问题,虽然有局部保序性,但是它也有突变性。在每个 Z 字母的拐角,都有可能出现顺序的突变。

Redis6.0新特性

1.多线程模型:

Threaded I/O
最终执行命令的线程依然是单线程,

参数配置 io-threads 4 // 这里说 有三个IO 线程,还有一个线程是main线程,main线程负责IO读写和命令执行操作 io-threads-do-reads yes // 将支持IO线程执行 读写任务。

新的单线程模型:
image.png

2. Client Side Cache

客户端缓存,减少非必要访问服务端
当客户端访问key时,会在客户端存储一个,避免直接跟服务端交互
当数据被修改是,服务端会通知客户端失效,
下次会访问服务端,而不是去客户端缓存

目前只有lettuce对其进行了支持:

  1. <dependency>
  2. <groupId>io.lettuce</groupId>
  3. <artifactId>lettuce-core</artifactId>
  4. <version>6.0.0.RELEASE</version>
  5. </dependency>
  1. public static void main(String[] args) throws InterruptedException {
  2. RedisClient redisClient = RedisClient.create("redis://192.168.109.200");
  3. Map<String, String> clientCache = new ConcurrentHashMap<>();
  4. StatefulRedisConnection<String, String> myself = redisClient.connect();
  5. CacheFrontend<String, String> frontend =
  6. ClientSideCaching.enable(CacheAccessor.forMap(clientCache),
  7. myself,
  8. TrackingArgs.Builder.enabled().noloop());
  9. String key="csk";
  10. int count = 0;
  11. while (true){
  12. System.out.println(frontend.get(key));
  13. TimeUnit.SECONDS.sleep(3);
  14. if (count++ == Integer.MAX_VALUE){
  15. myself.close();
  16. redisClient.shutdown();
  17. }
  18. }
  19. }

3. Acls

对命令的访问,权限控制

方式

  1. 命令方式

  2. 对acl配置文件编写,执行夹杂

ACL存储方式

  1. redis配置文件
  2. acl配置文件