性能优化-Redis数据库
概述
Redis是一个基于内存的key-value结构数据库,也是互联网技术领域使用最为广泛的存储中间件
官网:Redis - The Real-time Data Platform
中文网:Redis中文网
key-value结构存储:
| key | value |
|---|---|
| id | 10001 |
| name | 小智 |
| city | 北京 |
主要特点:
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
- 企业应用广泛
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到**100000+**的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库
NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充
关系型数据库(RDBMS):
- Mysql
- PostgreSQL
- Oracle
- SQLServer
非关系型数据库(NoSql):
- Redis
- Mongodb
- MemCached
Redis环境准备
下载与安装
安装
采用docker的方式来安装Redis
下载镜像:
1 | docker pull redis |
创建容器:
1 | docker run -d --name redis --restart=always -p 6379:6379 redis --requirepass "123456" |
查看效果:

客户端图形工具
图形化工具:Another Redis Desktop Manager
安装完毕后,直接双击启动

成功之后,可以直接查看Redis中存储的数据

如果客户端连接Redis失败,可以进入到容器内部操作:
1 | [root@localhost ~]# docker exec -it redis bash |
Redis数据类型及命令
概述
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
- 字符串 string
- 哈希 hash
- 列表 list
- 无序集合 set
- 有序集合 zset
字符串操作命令
Redis命令参考地址,Redis中文网:Redis 教程
Redis 中字符串类型常用命令:
以下是Redis常用命令的示例和说明:
| 语法 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| SET key value | 设置指定key的值为value | SET username “john” | 设置用户名为”john” |
| GET key | 获取指定key的值 | GET username | 获取名为username的值,返回”john” |
| SETEX key seconds value | 设置指定key的值为value,并将 key 的过期时间设为 seconds 秒(EX: EXpire) | SETEX session_token 3600 “abc123” | 设置会话令牌,3600秒(1小时)后自动过期 |
| SETNX key value | 在 key 不存在时设置 key 的值(分布式锁的原理)(NX: Not eXist) | SETNX lock:user:123 “locked” | 只有当lock:user:123不存在时才设置,用于实现分布式锁 |
- set key(同一个key),后执行的会覆盖之前的数据
- del key 删除key的数据,这个是通用的命令,不仅仅只是在字符串中适用
- setnx与set在存储数据的时候,set可以覆盖之前的数据,sexnx则不行
案例:
1 | > 192.168.100.168@6379 connected! |
哈希操作命令
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象
数据特点:

简易理解:
1 | // Redis哈希表可以类比为JSON对象 |
常用命令:
| 格式 | 说明 |
|---|---|
| HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
| HGET key field | 获取存储在哈希表中指定字段的值 |
| HKEYS key | 获取哈希表中所有字段 |
| HVALS key | 获取哈希表中所有值 |
| HDEL key field | 删除存储在哈希表中的指定字段 |
以下是Redis哈希表命令的示例和说明:
| 格式 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| HSET key field value | 将哈希表 key 中的字段 field 的值设为 value | HSET user:1001 name “Alice” | 在user:1001哈希表中设置name字段为”Alice” |
| HGET key field | 获取存储在哈希表中指定字段的值 | HGET user:1001 name | 获取user:1001哈希表中name字段的值 |
| HKEYS key | 获取哈希表中所有字段 | HKEYS user:1001 | 获取user:1001哈希表中所有字段名 |
| HVALS key | 获取哈希表中所有值 | HVALS user:1001 | 获取user:1001哈希表中所有字段的值 |
| HDEL key field | 删除存储在哈希表中的指定字段 | HDEL user:1001 name | 删除user:1001哈希表中的name字段 |
案例:
1 | > hset user name zhangsan |
列表操作命令
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般

常用命令:
| 格式 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| LPUSH key value1 [value2] | 将一个或多个值插入到列表头部,并返回列表中元素的个数 | LPUSH mylist “apple” “banana” | 将”apple”和”banana”插入到mylist列表头部 |
| LRANGE key start stop | 获取列表指定范围内的元素 | LRANGE mylist 0 -1 | 获取mylist列表中所有元素 |
| RPOP key | 移除并获取列表最后一个元素 | RPOP mylist | 移除并返回mylist列表的最后一个元素 |
| LLEN key | 获取列表长度 | LLEN mylist | 返回mylist列表中元素的个数 |
示例:
1 | > lpush list a b c |
集合操作命令
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常见命令:
以下是Redis集合命令的示例和说明:
| 格式 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| SADD key member1 [member2] | 向集合添加一个或多个成员 | SADD tags “redis” “database” “nosql” | 向tags集合添加三个成员 |
| SMEMBERS key | 返回集合中的所有成员 | SMEMBERS tags | 返回tags集合中的所有成员 |
| SCARD key | 获取集合的成员数 | SCARD tags | 返回tags集合中成员的数量 |
| SINTER key1 [key2] | 返回给定所有集合的交集 | SINTER group1 group2 | 返回group1和group2集合的交集 |
| SUNION key1 [key2] | 返回所有给定集合的并集 | SUNION group1 group2 | 返回group1和group2集合的并集 |
案例:
1 | > sadd set1 a b c d a |
有序集合操作命令
Redis的 SortedSet / ZSet 是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个**跳表(SkipList)加 hash表**
SortedSet具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能
常用命令:
| 格式 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员 | ZADD leaderboard 100 “Alice” 85 “Bob” 92 “Charlie” | 向leaderboard有序集合添加三个成员及其分数 |
| ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的成员 | ZRANGE leaderboard 0 -1 WITHSCORES | 返回leaderboard中所有成员按分数升序排列 |
| ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment | ZINCRBY leaderboard 10 “Alice” | 给Alice的分数增加10分 |
| ZREM key member [member …] | 移除有序集合中的一个或多个成员 remove | ZREM leaderboard “Bob” “Charlie” | 从leaderboard中移除Bob和Charlie |
示例:
1 | > zadd zset 10 heima |
通用键操作命令
Redis的通用键操作命令是不分数据类型,都可以使用的命令:
| 格式 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
| KEYS pattern | 查找所有符合给定模式(pattern)的 key | KEYS “user:*” | 查找所有以”user:”开头的key |
| EXISTS key | 检查给定 key 是否存在 | EXISTS username | 检查username这个key是否存在 |
| TYPE key | 返回 key 所储存的值的类型 | TYPE user:1001 | 返回user:1001的值类型 |
| DEL key | 该命令用于在 key 存在时删除 key | DEL temp_data | 删除temp_data这个key |
1 | > keys * |
Spring Data Redis
Redis常见的客户端
Redis 的 Java 客户端很多,常用的几种:
- Jedis
- Lettuce
- Spring Data Redis
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,封装了 Jedis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis
概述
Spring Data Redis 是 Spring 的一部分,在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作
Spring Boot提供了对应的Starter,maven依赖:
1 | <dependency> |
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为Operation接口,具体分类如下:
- ValueOperations:string数据操作
- HashOperations:hash类型的数据操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- ListOperations:list类型的数据操作
操作字符串数据类型
基于刚才的命令,字符串类型常见命令有:set get setex setnx
1 | /** |
操作哈希类型数据
基于刚才的命令,哈希类型常见命令有:hset hget hkeys hvals hdel
1 |
|
操作列表类型数据
基于刚才的命令,列表类型常见命令有:lpush lrange rpop lpop llen
1 | /** |
操作集合类型数据
基于刚才的命令,集合类型常见命令有:sadd smembers scard sinter sunion
1 | /** |
操作有序集合类型数据
基于刚才的命令,有序集合类型常见命令有:zadd zrange zincrby zrem
1 | /** |
通用命令操作
基于刚才的命令,字符串类型常见命令有:keys exists type del
1 | /** |