目录
[Spring Data Redis](#Spring Data Redis)
介绍与安装
概述
当用户登录后会频繁访问首页,每次都需要查询数据库,这让数据库压力很大,我们可以通过添加缓存Redis方式降低MySQL数据库压力。
Redis是一个基于内存的key-value结构的数据库,在项目开发中常用于做高速缓存、消息队列。(NoSQL数据库)

-
主要特点:
-
基于内存存储,读写性能极高
-
丰富的数据类型支持,value支持多种数据类型,功能丰富
-
单线程,每个命令都具备原子性
-
支持数据的持久化
-
企业应用十分广泛
-
NoSql:(Not Only SQL),不仅仅是SQL,泛指 非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
-
关系型数据库:Mysql、Oracle、SQL Server、DB2 等。
-
非关系型数据库:Redis、MongoDB、MemCached 等。
安装
1)目录结构

2). 双击 startup.bat 脚本,即可运行Redis数据库。
这样,就将Redis数据库启动起来了,启动起来后,我们可以双击 redis-cli.exe 打开Redis的客户端,输入一个指令 ping,如果响应了PONG,那就说明客户端和服务端连接上了。

-
双击
redis-cli.exe,会打开redis的客户端,默认连接的就是本机的6379端口的redis服务。 -
如果,要连接的是远程的Redis服务器,可以通过指定如下参数,进行连接:
-
-h :ip地址
-
-p :端口号
-
比如:
redis-cli.exe -h 192.168.100.200 -p 6379
-
Redis数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
|-------------------|--------|--------------------------------------|
| 数据类型 | 介绍 | 描述 |
| string | 字符串 | 普通字符串,redis中最简单的数据类型 |
| hash | 哈希 | 也叫散列,类似于java中的HashMap结构 |
| list | 列表 | 按照插入顺序排列,可以有重复元素,类似于java中的LinkedList |
| set | 集合 | 无序集合,没有重复元素,类似于java中的HashSet |
| zset / sorted-set | 有序集合 | 集合中每个元素关联一个分数(score),根据分数排序,没有重复元素 |

String

Redis 中字符串类型常用命令:
|----------------------------------|--------------------------------------------------|
| 命令 | 作用描述 |
| set key value | 设置指定 key 的值 |
| get key | 获取指定 key 的值 |
| mset key value [key value ...] | 同时设置一个或多个 key-value 对 |
| mget key1 key2 ... | 获取所有(一个或多个)给定 key 的值 |
| setnx key value | 只有在 key 不存在时设置 key 的值 |
| incr key | 将 key 中储存的数字值增一 |
| incrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
| decr key | 将 key 中储存的数字值减一 |
| decrby key decrement | key 所储存的值减去给定的减量值(decrement) |
| setex key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
Setex常用在验证码中
更多命令可以参考Redis中文网:https://www.redis.net.cn
Hash

Hash是一个string类型的field和value的映射表,特别适合存储对象。常见的操作命令:
|--------------------------------------------|--------------------------------------|
| 命令 | 作用描述 |
| hset key field value | 将哈希表 key 中的字段 field 的值设为 value |
| hget key field | 获取存储在哈希表中指定字段的值 |
| hmset key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
| hmget key field1 [field2] | 获取所有给定字段的值 |
| hdel key field2 [field2] | 删除一个或多个哈希表字段 |
| hkeys key | 获取所有哈希表中的字段 |
| hvals key | 获取哈希表中所有值 |
| hgetall key | 获取在哈希表中指定 key 的所有字段和值 |
user是大key name是小key
hset user name Tom
List

List(列表)是简单的字符串列表,按照插入顺序排序,可以出现重复的元素。
常用命令有:
|---------------------------------|------------------------------|
| 命令 | 作用描述 |
| lpush key value1 [value2] | 将一个或多个值插入到列表头部 |
| rpush key value1 [value2] | 在列表中添加一个或多个值 |
| lrange key start stop | 获取列表指定范围内的元素 |
| lpop key | 移出并获取列表的第一个元素 |
| rpop key | 移除并获取列表最后一个元素 |
| llen key | 获取列表长度 |
| rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
l开头是操作列表左边,r开头可以理解为操作列表的右边。
Set

Set(集合)是无序集合,集合中不能出现重复元素。
常用命令有:
|------------------------------|-----------------|
| 命令 | 作用描述 |
| sadd key member1 [member2] | 向集合添加一个或多个成员 |
| scard key | 获取集合的成员数 |
| smembers key | 返回集合中的所有成员 |
| spop key | 移除并返回集合中的一个随机元素 |
| sinter key1 [key2] | 返回给定所有集合的交集 |
| sunion key1 [key2] | 返回所有给定集合的并集 |
| sdiff key1 [key2] | 返回给定所有集合的差集 |
| srem key member1 [member2] | 移除集合中一个或多个成员 |
Zset

Sorted Set(有序集合)和集合一样不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来对集合中的成员进行排序。
常用命令有:
|----------------------------------------------------|------------------------------|
| 命令 | 作用描述 |
| zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
| zrange key start stop [withscores] | 通过索引区间返回有序集合成指定区间内的成员,分数从底到高 |
| zrangebyscore key min max [withscores] [limit] | 通过分数返回有序集合指定区间内的成员 |
| zrevrange key start stop [withscores] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
| zrevrangebyscore key max min [withscores] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
| zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
| zrem key member [member ...] | 移除有序集合中的一个或多个成员 |
| zcard key | 获取有序集合的成员数 |
Redis通用命令
所谓通用命令,指的是不区分数据类型都可以使用的命令:
|--------------|---------------------------|
| 命令 | 作用描述 |
| keys pattern | 查找所有符合给定模式( pattern)的 key |
| exists key | 检查给定 key 是否存在 |
| type key | 返回 key 所储存的值的类型 |
| del key | 该命令用于在 key 存在时删除 key |
Java程序操作Redis
Spring Data Redis
Spring生态中的Spring Data项目提供了统一的数据库操作框架,其中Spring Data Redis模块对Redis底层客户端进行了高度封装,显著简化了Redis数据库的开发和操作。

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
网址:https://spring.io/projects/spring-data-redis
Spring Boot提供了对应的Starter,maven坐标
1). 在 pom.xml 中引入SpringDataRedis的依赖
在 模块的 pom.xml 中引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2). application.yml 中配置Redis的数据库信息
指定连接的是本地的Redis,注解地址 127.0.0.1 ,端口号 6379。
spring:
data:
redis:
host: 127.0.0.1
port: 6379
3). 注入RedisTemplate(直接注入就可以不用新建)操作Redis数据库
java
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
//操作string类型
@Test
public void testString(){
//存
redisTemplate.opsForValue().set("name", "QK");
//取
System.out.println(redisTemplate.opsForValue().get("name"));
//设置过期时间
redisTemplate.opsForValue().set("gender", "男", 60, TimeUnit.SECONDS);
//取
System.out.println(redisTemplate.opsForValue().get("gender"));
}
操作完毕后,我们可以看到数据确实存入了Redis,有两个key:name、gender。

由于SpringDataRedis中提供的核心API,RedisTemplate底层在操作key、value的时候,对key和value进行了序列化操作,默认是通过JdkSerializationRedisSerializer实现的序列化,所以最终展示出来的就是我们看到的这个key,这个key就是序列化之后的效果。
在存入数据的时候,会自动的对数据进行序列化,在查询数据的时候,会自动的对查询的结果进行反序列化。
如果我们想看到普通字符串类型的key(比如:name,gender,而不是:"\xac\xed\x00\x05t\x00\x04name"),不要按照默认的序列化方式,进行序列化,我们是可以自己指定序列化方式的。具体操作如下:
在模块的包下增加一个配置类:
java
@Configuration
public class RedisConfig {
//指定Redis的key的序列化方式为string
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//自定义RedisTemplate
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//指定序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
return template;
}
}
-
**@Configuration:**用来声明当前类是一个配置类(也是IOC容器的bean,底层封装了@Component注解)。
-
**@Bean:**声明bean的注解,作用在方法上,会将方法的返回值对象加入IOC容器,成为IOC容器的bean对象。
其他类型操作
java
/**
* list 类型测试
*/
@Test
public void testList(){
//存一个
redisTemplate.opsForList().leftPush("mylist", "A");
//存多个
redisTemplate.opsForList().leftPushAll("mylist", "B", "C", "D");
//移除一个
System.out.println(redisTemplate.opsForList().rightPop("mylist"));
//取所有
System.out.println(redisTemplate.opsForList().range("mylist", 0, -1));
}
/**
* set 类型测试
*/
@Test
public void testSet(){
//存
redisTemplate.opsForSet().add("myset", "A", "B", "C", "D", "E", "F", "G");
//取所有
System.out.println(redisTemplate.opsForSet().members("myset"));
//获取集合大小
System.out.println(redisTemplate.opsForSet().size("myset"));
//取一个
System.out.println(redisTemplate.opsForSet().pop("myset"));
}
/**
* hash测试
*/
@Test
public void testHash(){
//存
redisTemplate.opsForHash().put("myhash", "name", "QK");
redisTemplate.opsForHash().put("myhash", "age", "18");
redisTemplate.opsForHash().put("myhash", "gender", "男");
//取
System.out.println(redisTemplate.opsForHash().get("myhash", "name"));
System.out.println(redisTemplate.opsForHash().get("myhash", "age"));
//获取所有key
System.out.println(redisTemplate.opsForHash().keys("myhash"));
//获取所有value
System.out.println(redisTemplate.opsForHash().values("myhash"));
}
/**
* zset 测试
*/
@Test
public void testZset(){
//存
redisTemplate.opsForZSet().add("myzset", "A", 1);
redisTemplate.opsForZSet().add("myzset", "B", 2);
redisTemplate.opsForZSet().add("myzset", "C", 3);
redisTemplate.opsForZSet().add("myzset", "D", 4);
redisTemplate.opsForZSet().add("myzset", "E", 5);
redisTemplate.opsForZSet().add("myzset", "F", 6);
// 取
System.out.println(redisTemplate.opsForZSet().range("myzset", 0, -1));
// 根据分数取
System.out.println(redisTemplate.opsForZSet().rangeByScore("myzset", 0, 3));
}