[TOC]java
Redis 是一个开源的使用 ANSI C 语言编写、遵照 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库(NoSQL)。git
PS: 我这里是基于Mac环境,Windows环境下的同窗能够安装Linux虚拟机同步进行操做。github
tar -zxvf redis-5.0.4.tar.gz mv redis-5.0.4 /usr/local/ cd /usr/local/redis-5.0.4/ make test
执行到这里,最好先执行一遍make test,确保编译能够经过,须要大概三分钟。
到这个就说明测试经过了。咱们接着往下执行redis
make cd src/ make install
执行到这里安装就算是告一段落了,接下来咱们进行redis的一些配置:spring
vim ../redis.conf
找到136行左右的daemonize
将其属性改成yes,可让redis在后台运行,而后找到500行左右的requirepass
,后面输入咱们须要设置的密码,这样就能够经过密码来访问redis了。
而后咱们经过指定配置文件的方式来启动redis数据库
./redis-server ../redis.conf
执行完事儿以后,查看是否执行成功:apache
ps -ef | grep redis
能够看到,咱们的redis已经启动成功了,而后经过rdm来访问一下:vim
大功告成,如今万事俱备,只欠东风。咱们下面来看一下在Spring Boot中怎么使用redis吧。缓存
Spring Boot给咱们提供了现成的spring-boot-starter-data-redis
,咱们只须要在pom文件中将之导入便可。bash
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 建立链接池 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
而后,咱们须要在配置文件中配置一些有关redis的信息:
spring: redis: host: 127.0.0.1 # IP port: 6379 # 端口号 password: 123456 # 密码 lettuce: pool: max-active: 8 # 链接池最大链接数 max-wait: -1ms # 链接池最大阻塞等待时间(使用负值表示没有限制) min-idle: 0 # 链接池中的最小空闲链接 max-idle: 8 # 链接池中的最大空闲链接
接下来,咱们须要对咱们所须要的Redis的操做给封装到一个接口中,方便咱们去调用,这里我基于接口,抽象类,实现类的结构实现了一套Redis的方法,须要的同窗能够去GitHub上下载(子项目名称:viboot-rds),GitHub的地址在文末。这里仅仅贴出接口的部分方法。
package com.itframe.dao; import java.util.List; import java.util.Map; import java.util.Set; /** * */ public interface RedisDao { /** * 判断缓存中是否有对应的value * * @param key * @return boolean */ public boolean existsKey(Object key); /** * 根据key获取key列表(key值可为模糊匹配---taskInfo:taskDetail:* <---> *表明任意字符) * * @param pattern * @return Set<Object> */ public Set<Object> keys(Object pattern); /** * 根据key删除对应的value * * @param key */ public boolean delete(Object key); /** * 根据key获取个数 * * @param key */ public int count(Object key); /** * 批量删除对应的value * * @param keys */ public void delete(String[] keys); /** * 批量删除key(key值可为模糊匹配---taskInfo:taskDetail:* <---> *表明任意字符) * * @param pattern */ public long deletePattern(Object pattern); /** * 批量删除对应的value * * @param keys */ public long delete(Set<Object> keys); /** * 写入缓存(操做字符串) * * @param key * @param value * @return boolean */ public boolean vSet(Object key, Object value); /** * 写入缓存设置时效时间(操做字符串) * * @param key * @param value * @return boolean */ public boolean vSet(Object key, Object value, Long expireTime); /** * 更新写入缓存设置时效时间(操做字符串) * * @param key * @return boolean */ public boolean vSetUpdate(Object key, Long expireTime); /** * 读取缓存(操做字符串) * * @param key * @return Object */ public Object vGet(Object key); /** * 哈希 添加(操做hash) * * @param key * @param hashKey * @param value */ public void hmSet(Object key, Object hashKey, Object value); /** * 哈希 添加(操做hash) * * @param key * @param map */ public void hmSetAll(Object key, Map<Object, Object> map); /** * 哈希获取数据(操做hash) * * @param key * @return Map<Object, Object> */ public Map<Object, Object> hmGet(Object key); /** * 哈希获取数据(操做hash) * * @param key * @param hashKey * @return Object */ public Object hmGet(Object key, Object hashKey); /** * 哈希删除数据(操做hash) * * @param key * @param hashKey * @return Object */ public Object hmDel(Object key, Object hashKey); }
在抽象类中咱们进行了RedisTemplate
的初始化以及序列化:
public abstract class AbstractBaseRedisDao<K, V> { @Resource(name = "redisTemplate") protected RedisTemplate<K, V> redisTemplate; /** * 设置redisTemplate * * @param redisTemplate */ public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) { this.redisTemplate = redisTemplate; } /** * 获取 RedisSerializer */ protected RedisSerializer<String> getRedisSerializer() { return redisTemplate.getStringSerializer(); } }
在实现类中咱们经过操做RestTemplate来实现接口中的方法~
首先,咱们若是想在Spring Boot项目中启用缓存,须要在启动类上加上注解@EnableCaching
,这个是重点,要记住了!
首先介绍一下注解三剑客:@Cacheable
, @CachePut
,@CacheEvict
。
@Cacheable
:主要针对方法配置,可以根据方法的请求参数对其进行缓存,经常使用于查询操做 @CachePut
:主要针对方法配置,可以根据方法的请求参数对其进行缓存,经常使用于修改操做@CacheEvict
:清空缓存,主要用于删除操做。下面咱们来看一下用法:
/** * value: 缓存的名称 * key: 缓存的键 * return 缓存的值 */ @Override @Cacheable(value = "users", key = "#id") public UserDO findOne(Long id) { // 若是咱们第二次访问的时候,控制台没有打印出这句话说明是从缓存中取出 log.info("From MYSQL"); return userMapper.get(id); } @Override @CachePut(value = "users", key = "#userDO.id") public UserDO update(UserDO userDO) { // 执行以后,再次访问findOne的时候,应当没有打印出“From MySQL”,且返回的是咱们修改后的值,说明这一步缓存成功 if (userMapper.update(userDO) > 0) { return userMapper.get(userDO.getId()); } return null; } @Override @CacheEvict(value = "users", key = "#id") public int delete(Long id) { // 执行以后去rdm中查看便可 return userMapper.delete(id); }
第一次访问findOne
第二次访问findOne:
仍然是刚刚的结果,可是控制台没有打印出任何东西,说明缓存成功
调用update后再次调用findOne:
能够看出信息已被修改且未访问数据库
访问delete,查看rdm:
说明删除成功~
记得顺手点个star,您的确定是对我写做最大的动力!
原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知