Java开发之Redis
简介
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库
Redis 与 其他 key - value 缓存产品均有以下特点:
-
Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储
-
Redis 支持数据的备份,即 master - slave 模式的数据备份
优点
-
性能极高 – Redis 读的速度是 110000 次 /s, 写的速度是 81000 次 /s 。
-
丰富的数据类型 - Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
-
原子性 - Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
-
其他特性 - Redis 还支持 publish/subscribe 通知,key 过期等特性。
数据类型、数据结构
Redis 支持 5 种数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)
支持 8 种数据结构:int、 raw、 embstr、 ziplist、 linkedlist、 hashtable 、intset、 skiplist
存储类型和数据结构的关系
Redis 中的 Key 与 Value 在表层都是一个 redisObject 实例 (5 种存储类型与 8 种数据结构的桥梁), 所以该结构有所谓的 "类型", 即是 ValueType. 对于每一种 ValueType 类型的 redisObject;
redisObject 至少支持两种不同的底层数据结构来实现. 以应对在不同的应用场景中, 如 Redis 的运行效率, 或内存占用等。
redisObject 主要的字段有 encoding(数据结构) type(存储类型) *ptr(指向底层实现的数据结构指针) refcount(引用计数) lru(最后一次被命令程序访问的时间)
ps: 详见Redis 数据结构底层实现
使用场景
RedisTemplate
Redis 的基础信息及 5 种数据结构的概念大致介绍到这,下面将结合 Spring 封装的 RedisTemplate 来对这 5 种数据结构进行讲解
5 种数据结构操作
redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作 hash redisTemplate.opsForList();//操作 list redisTemplate.opsForSet();//操作 set redisTemplate.opsForZSet();//操作有序 set
对于这 5 种数据结构的具体操作可以通过查看源码知晓 (源码解释很详细了),当然也可以参考《如何使用 RedisTemplate 访问 Redis 数据结构》
序列化策略
在这里我需要解释,也是开发中经常遇到的问题 -- 序列化策略问题
spring-data-redis 中 redisTemplate 默认使用 JDK 的序列化策略, 会出现两个问题:
- 使用 redis-cli 查看数据时, 携带很多字符, 不易查看
- JDK Serializer 太费资源
当然序列化策略是可以自定义的,spring-data-redis 的序列化类有下面这几个:
- GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
- Jackson2JsonRedisSerializer: 跟 JacksonJsonRedisSerializer 实际上是一样的
- JacksonJsonRedisSerializer: 序列化 object 对象为 json 字符串
- JdkSerializationRedisSerializer: 序列化 java 对象(被序列化的对象必须实现 Serializable 接口)
- StringRedisSerializer: 简单的字符串序列化
- GenericToStringSerializer: 类似 StringRedisSerializer 的字符串序列化
- GenericJackson2JsonRedisSerializer: 类似 Jackson2JsonRedisSerializer,但使用时构造函数不用特定的类参考以上序列化, 自定义序列化类; 推荐使用
顺便介绍一下 StringRedisTemplate 吧,这货是 RedisTemplate 的子类,默认采用的是 String 的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的。
作者:JackpotHan
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。