一、Redis 入门
Redis 介绍
是什么?
●基于内存的 K / V 存储中间件
●NoSQL 键值对数据库
Redis 不仅仅是数据库,它还能作为消息队列等等。
VALUE
KEY
ID
1001
张三
NAME
21
AGE
J
"ID":1001,
"NAME":"张三",
1001
"AGE": 21
键值数据库
关系型 SQL 和 NoSQL 的对比
其中应用场景是关键:
认识NOSQL
SQL
NOSQL
#1 键值类型(REDIS)
结构化(STRUCTURED)
非结构化
数据结构
#2 文档类型(MONGODB)
无关联的
关联的(RELATIONAL)
#3 列类型(HBASE)
数据关联
#4 GRAPH类型(NEO4J)
非SQL
查询方式
SQL查询
事务特性
BASE
ACID
存储方式
磁盘
内存
扩展性
水平
垂直
1)数据结构不固定
1)数据结构固定
使用场景
2)对一致性,安全性要求不高
2)相关业务对数据安全性,
3)对性能要求
一致性要求较高
Redis 特征
1支持多种数据结构
2单线程,每个命令的执行具备原子性,中途不会执行其他命令(指命令处理始终是单线程的,自 6.x 起改为多线程接受网络请求)
3高性能、低延时(基于内存、IO 多路复用、良好编码)
4支持数据持久化
5支持主从、分片集群
6支持多语言客户端
Redis 安装
建议 Linux 下安装,直接到官网安装即可,注意安装后更改 redis.conf 文件,设置 bind ip、requirepass 密码等参数。
Redis 连接方式
●redis-cli
●GUI
●多语言 SDK
Redis 常用命令
Redis 的命令根据数据结构分为多个组。
不用背!忘了就查:
1)redis 官网命令集:Commands | Redis,中文版:Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)
查看通用的命令
通用命令
●set key value
●get key
●keys pattern 模糊搜索多个 key。性能较差,生产环境(尤其是主节点)不建议使用
●del key...
●exists key 判断 key 是否存在
●expire key 设置过期时间
●ttl key 查询剩余存活时间,未设置过期时间则为 -1
Redis 基本数据结构
String 类型
支持存储字符串、数字、浮点数(实际存储都是字节数组):
VALUE
KEY
HELLO WORLD
MSG
10
NUM
92.5
SCORE
单 key 的 value 最大不能超过 512 M!
STRING类型的常见命令
STRING的常见命令有:
SET:添加或者修改已经存在的一个STRING类型的键值对
GET:根据KEY获取STRING类型的VALUE
MSET:批量添加多个STRING类型的键值对
MGET:根据多个KEY获取多个STRING类型的VALUE
INCR:让一个整型的KEY自增1
INCRBY:让一个整型的KEY自增并指定步长,例如:INCRBYNUM2让NUM值自增2
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX:添加一个STRING类型的键值对,前提是这个KEY不存在,否则不执行
SETEX:添加一个STRING类型的键值对,并且指定有效期
实际使用时,通常用冒号连接多个词来拼接 key,比如 [项目名]:[业务名]:[类名]:[id]。在某些 GUI 工具中,会自动根据冒号来划分层级,浏览更方便。
Hash 类型
值是一个 Hash 结构(类似 Java 的 HashMap):
HASH结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
VALUE
KEY
FIELD
VALUE
JACK
NAME
HEIMA:USER:1
21
AGE
ROSE
NAME
HEIMA:USER:2
18
AGE
常用命令:
其实就是在 String 命令名的基础上增加了 'H' 首字母
HASH类型的常见命令
HASH的常见命令有:
HSET KEY FIELD VALUE:添加或者修改HASH类型KEY的FIELD的值
HGET KEY FIELD:获取一个HASH类型KEY的FIELD的值
HMSET:批量添加多个HASH类型KEY的FIELD的值
HMGET:批量获取多个HASH类型KEY的FIELD的值
HGETALL:获取一个HASH类型的KEY中的所有的FIELD和VALUE
HKEYS:获取一个HASH类型的KEY中的所有的FIELD
HVALS:获取一个HASH类型的KEY中的所有的VALUE
HINCRBY:让一个HASH类型KEY的字段值自增并指定步长
HSETNX:添加一个HASH类型的KEY的FIELD值,前提是这个FIELD不存在,否则不执行
List 类型
理解为 Java 的 LinkedList 双向链表,特点是有序、插入删除快、但查找性能一般:
常见命令如下:
有点像操作一个双端队列
LIST类型的常见命令
LIST的常见命令有:
LPUSH KEY ELEMENT...向列表左侧插入一个或多个元素
LPOPKEY:移除并返回列表左侧的第一个元素,没有则返回NIL
RPUSH KEY ELEMENT...向列表右侧插入一个或多个元素
RPOP KEY:移除并返回列表右侧的第一个元素
LRANGE KEY STAR END:返回一段角标范围内的所有元素
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回NIL
RPUSH
LPUSH
LPOP
RPOP
LRANGE KEY 1, 2
Set 类型
集合,类似于 Java 中的 HashSet,特点是单 set 内元素不能重复、查找性能高。
常见命令如下:
分为单集合命令和多集合命令(交并差集)
SET类型的常见命令
STRING的常见命令有:
SADDKEYMEMBER....向SET中添加一个或多个元素
S1
SREM KEY MEMBER...移除SET中的指定元素
S1 DIFF
S2
SCARD KEY:返回SET中元素的个数
SISMEMBERKEY MEMBER:判断一个元素是否存在于SET中
SMEMBERS:获取SET中的所有元素
B
INTER
SINTERKEY1KEY2...:求KEY1与KEY2的交集
SDIFFKEY1KEY2...:求KEY1与KEY2的差集
SUNION KEY1 KEY2.:求KEY1和KEY2的并集
S2
SortedSet 类型
有序集合,在 set 的基础上给每个元素多存了一个分数,类似于 value 类型为整型的 HashMap。
特点是有序、查找性能高,适合用于排行榜、统计 TopN。
常见命令:
和 set 结构的命令很像
SORTEDSET类型的常见命令
SORTEDSET的常见命令有:
ZADDKEY SCOREMBER:添加一个或多个元素到SORTED SET, 如果已经存在则更新其SCORE值
ZREM KEY MEMBER:删除SORTED SET中的一个指定元素
ZSCORE KEY MEMBER:获取SORTED SET中的指定元素的SCORE值
ZRANK KEY MEMBER:获取SORTED SET 中的指定元素的排名
ZCARD KEY:获取SORTED SET中的元素个数
ZCOUNTKEYMIN MAX:统计SCORE值在给定范围内的所有元素的个数
ZINCRBYKEYINCREMENTMEMBER:让SORTED SET中的指定元素自增,步长为指定的INCREMENT值
ZRANGEKEYMIN MAX:按照SCORE排序后,获取指定排名范围内的元素
ZRANGEBYSCOREKEYMIN MAX:按照SCORE排序后,获取指定SCORE范围内的元素
ZDIFF,ZINTER,ZUNION:求差集,交集,并集
注意:所有的排名默认都是升序,如果要降序则在命令的乙后面添加REV即可
Redis 客户端
主流客户端
可以在 Redis 官网查看所有客户端以及推荐的客户端:Get started using Redis clients | Redis
对于 Java,主要推荐以下 3 种:
JAVA
Y OTHER
A JDBC CLIENT FOR REDIS.
JDBC-REDIS
Y OTHER
JREDIS
A REDIS CLIENT.
P OTHER
A BLAZINGLY SMALL AND SANE REDIS JAVA
JEDIS
CLIENT
A JAVA CLIENT THAT PROVIDES CONNECTION
RJC
OTHER
POOLING IN APACHE DBCP STYLE,SHARDING,
PIPELINES,TRANSACTIONS AND MESSAGES.
I
REDISSON
DISTRIBUTED AND SCALABLE JAVA DATA
OTHER
STRUCTURES ON TOP OF REDIS SERVER
OTHER
ASYNCHRONOUS,PIPELINED CLIENT BASED ON
AREDIS
THE JAVA 7 NIO CHANNEL API
Y OTHER
A VERY SIMPLE YET VERY COMPLETE JAVA
JAVA-REDIS-CLIENT
CLIENT IN LESS THAN 200 LINES WITH O
DEPENDENCIES.
ADVANCED REDIS CLIENT FOR THREAD-SAFE
OTHER
LETTUCE
SYNC,ASYNC,AND REACTIVE USAGE.
SUPPORTS CLUSTER,SENTINEL,PIPELINING,AND
CODECS.
其中,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,划分更明确:
返回值类型
说明
API
操作STRING类型数据
REDISTEMPLATE.OPSFORVALUE()
VALUEOPERATIONS
操作HASH类型数据
REDISTEMPLATE.OPSFORHASH()
HASHOPERATIONS
操作LIST类型数据
REDISTEMPLATE.OPSFORLIST()
LISTOPERATIONS
操作SET类型数据
REDISTEMPLATE.OPSFORSET()
SETOPERATIONS
操作SORTEDSET类型数据
REDISTEMPLATE.OPSFORZSET()
ZSETOPERATIONS
通用的命令
REDISTEMPLATE
注意,要在 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 读出数据时也要手动反序列化。
1