Spring Boot集成Redis
1. Redis介绍
Redis 是一种非关系型数据库(NoSQL),并且是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括String(字符串)、List(链表)、Set(集合)、Z-Set(sorted set-有序集合)和Hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。它和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说SQL标准,ACID属性,表结构等,这类数据库主要有一下特点:非关系型的、分布式的、开源的、水平可扩展的。NoSQL 使用场景有:对数据高并发读写、对海量数据的高效率存储和访问、对数据的高可扩展性和高可用性等。
2. Redis安装
安装使用的是在VMware虚拟机中Centos7镜像中安装的Redis,当然也可以在阿里云服务器中进行安装Redis。只要使用命令行能ping的通云主机或者虚拟机的ip,然后在云主机或者虚拟机中放行对应的端口号(或或者关掉防火墙)即可访问Redis。以下是安装步骤:
- 安装gcc编译
因为后面安装redis的时候需要编译,所以事先得先安装gcc编译。阿里云主机已经默认安装了 gcc,如果是自己安装的虚拟机,那么需要先安装一下 gcc:
yum install gcc-c++
- 创建一个存放Redis的文件夹,下载安装包
//创建一个文件夹用于存放Redis
mkdir redisfile
//进入新创建的文件夹
cd redisfile/
//直接使用 wget 命令下载(这里使用的是4.0.9版本)
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
- 解压安装包
tar -zxvf redis-4.0.9.tar.gz
- 开始安装
首先切换到redis-4.0.9文件夹下,然后进行安装
//进入redis-4.0.9文件夹
cd redis-4.0.9
//安装
make
- 启动Redis服务
首先切换到src文件夹下,然后再启动Redis服务
//进入src文件夹
cd src
//启动服务
./redis-server
3. Spring Boot集成Redis
3.1 依赖导入
Spring Boot 集成 redis 很方便,只需要导入一个 redis 的 starter 依赖即可。以来如下:
<!– 引入redis依赖 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2 Redis配置
导入依赖之后在application.properties文件中配置Redis,配置如下:
############################################################ # REDIS 配置 ############################################################ spring.redis.database=0
# 配置redis的主机地址,需要修改成自己的 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=
# 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽) spring.redis.jedis.pool.max-active=8
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接,默认值也是8。 spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接,默认值也是0。 spring.redis.jedis.pool.min-idle=2 spring.redis.timeout=6000
3.3 封装Json工具类
这个工具类比较简单,封装操作redisTemplate的实现类。这个工具类只是简单的封装了StringRedisTemplate,其他相关的数据类型大家可以根据自己的需要自行扩展。内容如下:
package com.wyl.utils; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; /** * * @Title: RedisOperator.java * @Package com.wyl.utils * @Description: 使用redisTemplate的操作实现类 * @author wyl * @date 2021年5月25日 下午4:11:22 * @version V1.0 */ @Component public class RedisOperator { // @Autowired // private RedisTemplate<String, Object> redisTemplate; @Autowired private StringRedisTemplate redisTemplate; // Key(键),简单的key-value操作 /** * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。 * * @param key * @return */ public long ttl(String key) { return redisTemplate.getExpire(key); } /** * 实现命令:expire 设置过期时间,单位秒 * * @param key * @return */ public void expire(String key, long timeout) { redisTemplate.expire(key, timeout, TimeUnit.SECONDS); } /** * 实现命令:INCR key,增加key一次 * * @param key * @return */ public long incr(String key, long delta) { return redisTemplate.opsForValue().increment(key, delta); } /** * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key */ public Set<String> keys(String pattern) { return redisTemplate.keys(pattern); } /** * 实现命令:DEL key,删除一个key * * @param key */ public void del(String key) { redisTemplate.delete(key); } // String(字符串) /** * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key) * * @param key * @param value */ public void set(String key, String value) { redisTemplate.opsForValue().set(key, value); } /** * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒) * * @param key * @param value * @param timeout * (以秒为单位) */ public void set(String key, String value, long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); } /** * 实现命令:GET key,返回 key所关联的字符串值。 * * @param key * @return value */ public String get(String key) { return (String)redisTemplate.opsForValue().get(key); } // Hash(哈希表) /** * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value * * @param key * @param field * @param value */ public void hset(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } /** * 实现命令:HGET key field,返回哈希表 key中给定域 field的值 * * @param key * @param field * @return */ public String hget(String key, String field) { return (String) redisTemplate.opsForHash().get(key, field); } /** * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 * * @param key * @param fields */ public void hdel(String key, Object... fields) { redisTemplate.opsForHash().delete(key, fields); } /** * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。 * * @param key * @return */ public Map<Object, Object> hgetall(String key) { return redisTemplate.opsForHash().entries(key); } // List(列表) /** * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头 * * @param key * @param value * @return 执行 LPUSH命令后,列表的长度。 */ public long lpush(String key, String value) { return redisTemplate.opsForList().leftPush(key, value); } /** * 实现命令:LPOP key,移除并返回列表 key的头元素。 * * @param key * @return 列表key的头元素。 */ public String lpop(String key) { return (String)redisTemplate.opsForList().leftPop(key); } /** * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。 * * @param key * @param value * @return 执行 LPUSH命令后,列表的长度。 */ public long rpush(String key, String value) { return redisTemplate.opsForList().rightPush(key, value); } }
3.4 创建RedisController控制器
package com.wyl.controller; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.wyl.utils.JSONResult; import com.wyl.pojo.SysUser; import com.wyl.pojo.User; import com.wyl.utils.JsonUtils; import com.wyl.utils.RedisOperator; @RestController @RequestMapping("redis") public class RedisController { @Autowired private StringRedisTemplate strRedis; @Autowired private RedisOperator redis; @RequestMapping("/test") public JSONResult test() { SysUser user = new SysUser(); user.setId("20210001"); user.setUsername("admin"); user.setPassword("123456"); user.setIsDelete(0); user.setRegistTime(new Date()); strRedis.opsForValue().set("json:user", JsonUtils.objectToJson(user)); return JSONResult.ok(user); } @RequestMapping("/getJsonList") public JSONResult getJsonList() { User user = new User(); user.setAge(18); user.setName("张三"); user.setPassword("123456"); user.setBirthday(new Date()); User u1 = new User(); u1.setAge(19); u1.setName("李四"); u1.setPassword("123456"); u1.setBirthday(new Date()); User u2 = new User(); u2.setAge(17); u2.setName("王五"); u2.setPassword("123456"); u2.setBirthday(new Date()); List<User> userList = new ArrayList<>(); userList.add(user); userList.add(u1); userList.add(u2); redis.set("json:info:userlist", JsonUtils.objectToJson(userList), 2000); String userListJson = redis.get("json:info:userlist"); List<User> userListBorn = JsonUtils.jsonToList(userListJson, User.class); return JSONResult.ok(userListBorn); } }
- 说明
1. test: 是没有封装的,原生的Redis 客户端操作Redis的方法。
2. getJsonList :是封装的工具类操作调用方法。
3.5 测试
在浏览器中输入:http://localhost:8080/redis/test 查看是否有数据返回即可。
4. 总结
以上内容主要介绍了Redis的使用场景、安装过程,以及Spring Boot 中集成Redis 的详细步骤。在实际项目中,通常使用Redis作为缓存,在查询数据库时,会先从Redis中查找,如果有信息就从Redis中取;如果没有则从数据库中查,并且同步到Redis中,下次Redis中就有了。更新和删除也是需要同步到Redis中。Redis在高并发场景下运用的非常广泛。