一、Redis 入门
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-cli
Gul
多语言SDK
Redis常用命令
Redis的命令根据数据结构分为多个组。
不用背!忘了就查:
- redis官网命令集: https://redis.io/commands/,中文版: http://www.redis.cn/commands.html
- redis-cli help命令查看,help [command]可以查看某个具体命令、help @xxx可以查看某个分组下的命令
通用命令.
set key value.
get 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 读出数据时也要手动反序列化。