簡介
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都是采用此策略序列化保存的。