quicklist 。因为普通的链表需要的附加指针空间太大,会比较浪费空间 。比如这个列表里存的只是
int 类型的数据,结构上还需要两个额外的指针 prev 和 next 。所以 Redis 将链表和
ziplist 结合起来组成了 quicklist 。也就是将多个 ziplist
使用双向指针串起来使用 。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余 。
哈希表(hash)
hash 与 Java 中的 HashMap
差不多,实现上采用二维结构,第一维是数组,第二维是链表 。hash 的 key 与 value
都存储在链表中,而数组中存储的则是各个链表的表头 。在检索时,首先计算 key 的
hashcode,然后通过 hashcode 定位到链表的表头,再遍历链表得到 value
值 。可能您比较好奇为啥要用链表来存储 key 和 value,直接用 key 和 value
一对一存储不就可以了吗?其实是因为有些时候我们无法保证 hashcode
值的唯一,若两个不同的 key 产生了相同的
hashcode,我们需要一个链表在存储两对键值对,这就是所谓的 hash 碰撞 。
集合(set)
熟悉 Java 的同学应该知道 HashSet 的内部实现使用的是 HashMap,只不过所有的 value
都指向同一个对象 。Redis 的 Set 结构也是一样,它的内部也使用 Hash 结构,所有的
value 都指向同一个内部值 。
有序集合(sorted set)
有时也被称作 ZSet,是 Redis
中一个比较特别的数据结构,在有序集合中我们会给每个元素赋予一个权重,其内部元素会按照权重进行排序,我们可以通过命令查询某个范围权重内的元素,这个特性在我们做一个排行榜的功能时可以说非常实用了 。其底层的实现使用了两个数据结构,
hash 和跳跃列表,hash 的作用就是关联元素 value 和权重 score,保障元素 value
的唯一性,可以通过元素 value 找到相应的 score 值 。跳跃列表的目的在于给元素 value
排序,根据 score 的范围获取元素列表 。
在 Spring Boot 项目中使用 Redis准备工作
开始在 Spring Boot 项目中使用 Redis 之前,我们还需要一些准备工作 。
- 一台安装了 Redis 的机器或者虚拟机 。
- 一个创建好的 Spring Boot 项目 。
Spring Boot 官方已经为我们提供好了集成 Redis 的 Starter,我们只需要简单地在
pom.xml 文件中添加如下代码即可 。Spring Boot 的 Starter
给我们在项目依赖管理上提供了诸多便利 。
清单 1. 添加 Redis 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>添加完依赖之后,我们还需要配置 Redis的地址等信息才能使用,在 Application.properties 中添加如下配置即可 。
清单 2. Spring Boot 中配置 Redis
spring.redis.host=192.168.142.132spring.redis.port=6379# Redis 数据库索引(默认为 0)spring.redis.database=0 # Redis 服务器连接端口# Redis 服务器连接密码(默认为空)spring.redis.password=#连接池最大连接数(使用负值表示没有限制)spring.redis.jedis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.jedis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0Spring Boot 的 spring-boot-starter-data-redis 为 Redis的相关操作提供了一个高度封装的 RedisTemplate 类,而且对每种类型的数据结构都进行了归类,将同一类型操作封装为
operation 接口 。RedisTemplate 对五种数据结构分别定义了操作,如下所示:
- 操作字符串:redisTemplate.opsForValue()
- 操作 Hash:redisTemplate.opsForHash()
- 操作 List:redisTemplate.opsForList()
- 操作 Set:redisTemplate.opsForSet()
- 操作 ZSet:redisTemplate.opsForZSet()
- RedisTemplate 是一个泛型类,而 StringRedisTemplate 不是,后者只能对键和值都为 String 类型的数据进行操作,而前者则可以操作任何类型 。
- 两者的数据是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理RedisTemplate 中
的数据 。
一个 Spring Boot
项目中,我们只需要维护一个 RedisTemplate 对象和一个 StringRedisTemplate 对象就可以了 。所以我们需要通过一个 Configuration 类来初始化这两个对象并且交由的 BeanFactory 管理 。我们在 cn.itweknow.sbredis.config包下面新建了一个 RedisConfig 类,其内容如下所示:
推荐阅读
- 续航不够省电来凑,手机省电最全攻略
- 图解Raft:应该是最容易理解的分布式一致性算法
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 绿茶冲泡最全攻略,全麦绿茶馒头的做法
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 柴犬的价格应该是估计 柴犬价格为什么这么贵
- 白茶收藏需注意的问题,冲泡白茶的水温应该是多少
- 狗狗正常体温应该是多少 狗狗多少体温属于正常
- 湖南|在职场中,哪些心态应该是必备的?
- 全网最全的IDEA热部署方案,看完弄懂,再也不用加班
