专业的JAVA编程教程与资源

网站首页 > java教程 正文

Redis基本数据结构之字符串(redis的字符串类型是怎样实现的)

temp10 2024-11-10 11:34:02 java教程 6 ℃ 0 评论

纸上学来终觉浅,绝知此事要躬行!

字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。如图2-7所示,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

Redis基本数据结构之字符串(redis的字符串类型是怎样实现的)

接下来我们按照三个部分介绍

  1. 内部编码
  2. 常用命令
  3. 典型使用场景

内部编码

就像Java中的HashMap是由数组+链表+红黑树的方式实现一样,字符串这种数据结构也有自己的底层的内部编码实现,而且不止一种。

对于字符串来说,它的内部编码实现有三种:

  1. int:8个字节的长整型;
  2. embstr:长度小指定字节数的字符串;
  3. raw:长度大于指定字节数的字符串;

Redis会根据当前设置的值得类型和长度,决定使用哪种内部编码,两种字符串的编码格式选择,在不同的redis版本中,略有差别,甚至在更早的版本里(比如2.8)是没有embstr编码类型的。


采用不同的内部编码的好处包括(1)改进内部编码时,对外部的数据结构和命令没有任何影响,就像刚说过的embstr编码类型的字符串一样;(2)多种不同的编码实现可以在不同的场景下发挥各自的优势。

在这里,我们简单介绍一下关于embstr和raw两种内部编码有什么区别,raw表示redis使用一个简单动态字符串(SDS)来保存这个字符串,它会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构。而embstr是针对短字符串的一种优化的编码方式,它只会调用一次内存分配函数来分配一个连续的空间,空间中依次包含redisObject结构和sdshdr结构。

Redis中每个对象都由一个redisObject结构表示

typedef struct redisObject {
	// 类型
  unsigned type 4;
  // 编码,比如embstr、raw
  unsigned encoding 4;
  // 指向底层实现数据结构的指针
  void *ptr
  // ......
} robj;
// 每个sdshdr结构表示一个SDS值
struct sdshdr {
  // 记录buf中已使用的字节的数量,就是SDS保存的字符串的长度
	int len;
  // buf中未使用的字节的数量
  int free;
  // 保存字符串的字节数组
  char buf[];
}

我这里使用的是3.2版本长度阈值是45

常用命令

比较常用命令,包括设置值、获取值、批量设置值、批量获取值、自增、自减等

(1)设置值

设置单个key的值:set key value [ex seconds] [px milliseconds] [nx|xx]

参数说明:[ex seconds]可选参数,秒级过期时间;[px milliseconds]可选参数毫秒级过期参数;[nx]可选限制参数,key必须不存在才可以设置成功,用于添加;[xx]可选限制参数,key必须存在才可以设置成功,用于更新

批量设置值:mset key1 value1 key2 value2......

(2)自增、自减

自增/自减1:incr/decr key

如果key不存在,则默认初始为0

自增/自减指定值:incrby/decrby key arg

指定增减arg值

(3)其他命令

删除:del key1 [key2......]

获取值长度:strlen key

追加内容:append key value

典型使用场景

(1)缓存场景

缓存是一个非常普遍的使用场景,redis作为缓存层,可以把热点数据放在redis里,减小存储层压力的同时增加访问速度,毕竟内存的的访问速度比磁盘的访问速度快的不是一点半点。

(2)计数

通过自增命令,可以实现快速计数、查询缓存的功能,并且数据可以异步落地到其他数据源。

(3)共享session

伴随着分布式web应用的普及,session共享应运而生,为了解决这个问题,可以使用redis管理用户的session信息,只需要保证redis的高可用和扩展性即可。

(4)限速

对于很多提供手机验证码登录的网站来说,会有被刷短信接口的风险,为了防止短信接口的频繁访问,会限制每个手机号每分钟获取验证码的频率,该功能即可用Redis来实现。

(5)分布式锁

关于分布式锁,请看我的另外一篇文章分布式锁,这篇文章可以帮到你

Redis基本数据结构之列表

Redis基本数据结构之哈希

Redis基本数据结构之集合

Redis基本数据结构之有序集合

Redis学习笔记之全局命令

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表