Redis 介绍
是什么?
基于内存的 K / V 存储中间件
NoSQL 键值对数据库
Redis 不仅仅是数据库,它还能作为消息队列等等。
关系型 SQL 和 NoSQL 的对⽐
其中应⽤场景是关键:
Redis 特征
1. ⽀持多种数据结构 2. 单线程,每个命令的执⾏具备原⼦性,中途不会执⾏其他命令(指命令处理始终是单线程的,⾃ 6.x 起改为多 线程接受⽹络请求) 3. ⾼性能、低延时(基于内存、IO 多路复⽤、良好编码) 4. ⽀持数据持久化 5. ⽀持主从、分⽚集群 6. ⽀持多语⾔客户端
Redis 安装
建议 Linux 下安装,直接到官⽹安装即可,注意安装后更改 redis.conf ⽂件,设置 bind ip、requirepass 密码等参数。
Redis 连接⽅式
redis-cliGUI
多语⾔ SDK
Redis 常⽤命令
Redis 的命令根据数据结构分为多个组。
不⽤背!忘了就查:
1)redis 官⽹命令集:https://redis.io/commands/,中⽂版:http://www.redis.cn/commands.html
2)redis-cli help 命令查看,help [command] 可以查看某个具体命令、help @xxx 可以查看某个分组下的命令
通⽤命令
set key valueget key
keys pattern 模糊搜索多个 key。性能较差,⽣产环境(尤其是主节点)不建议使⽤
del key...
exists key 判断 key 是否存在
expire key 设置过期时间
ttl key 查询剩余存活时间,未设置过期时间则为 -1
Redis 基本数据结构
String 类型
⽀持存储字符串、数字、浮点数(实际存储都是字节数组):
单 key 的 value 最⼤不能超过 512 M!
实际使⽤时,通常⽤冒号连接多个词来拼接 key,⽐如 [项⽬名]:[业务名]:[类名]:[id]。在某些 GUI ⼯具中,会⾃动根据冒号来划分层级,浏览更⽅便。
Hash 类型
值是⼀个 Hash 结构(类似 Java 的 HashMap):
常⽤命令:
其实就是在 String 命令名的基础上增加了 'H' ⾸字⺟
List 类型
理解为 Java 的 LinkedList 双向链表,特点是有序、插⼊删除快、但查找性能⼀般:常⻅命令如下:
有点像操作⼀个双端队列
Set 类型
集合,类似于 Java 中的 HashSet,特点是单 set 内元素不能重复、查找性能⾼。常⻅命令如下:
分为单集合命令和多集合命令(交并差集)
SortedSet 类型
有序集合,在 set 的基础上给每个元素多存了⼀个分数,类似于 value 类型为整型的 HashMap。特点是有序、查找性能⾼,适合⽤于排⾏榜、统计 TopN。
常⻅命令:
和 set 结构的命令很像
Redis 客户端
可以在 Redis 官⽹查看所有客户端以及推荐的客户端:https://redis.io/docs/clients
对于 Java,主要推荐以下 3 种:其中,Jedis 的命令和原⽣ redis 命令⾏的命令⼀致,学习成本最低(注意它是线程不安全的,通常配合连接池使⽤);Lettuce 和 Spring 兼容最好(Spring Data Redis 默认集成)、基于 Netty 性能最⾼;Redisson 提供了和 Java 集合⽤法⼀致的分布式集合,适⽤于更复杂的业务场景。
Spring Data Redis
Spring Data 整合封装了⼀系列数据访问的操作,Spring Data Redis 则是封装了对 Jedis、Lettuce 这两个 Redis
客户端的操作,提供了统⼀的 RedisTemplate 来操作 Redis。
RedisTemplate 针对不同的 Redis 数据结构提供了不同的 API,划分更明确:
注意,要在 Spring Data Redis 中使⽤ Lettuce 线程池的话,要额外引⼊ apache commons-pool2 依赖。
RedisTemplate 序列化
RedisTemplate 默认使⽤ JDK 原⽣序列化器,可读性差、内存占⽤⼤,因此可以⽤以下两种⽅式来改变序列化机制:
1. ⾃定义 RedisTemplate,指定 key 和 value 的序列化器
2. 使⽤⾃带的 StringRedisTemplate,key 和 value 都默认使⽤ String 序列化器,仅⽀持写⼊ String 类型的
key 和 value。因此需要⾃⼰将对象序列化成 String 来写⼊ Redis,从 Redis 读出数据时也要⼿动反序列化。