redis
远程连接redis
#将6379端口开放
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
#修改redis.conf文件中的配置
bind:172.0.0.1 #将此行注释掉,表示不限制ip
requirepass 123456 #设置auth密码为123456
#/dae... 改为yes 表示可以后台启动
src/redis-server ./redis.conf #修改之后启动服务需要加载conf 才可以后台启动
#在另一台电脑上的redis-cli所在目录访问
./redis-cli -h 172.16.124.129(虚拟机ip地址) -p 6379(端口号) -a 123456(密码验证)
redis数据类型及对应的操作命令
- redis存储的是
k-v结构
的数据,其中key是字符串类型,value有5种常用的数据类型字符串String;哈希Hash;列表List;集合Set;有序集合Sorted Set
。
1、String
SET key value | 设置指定key的值 |
---|---|
GET key | 获取指定key的值 |
SETEX key seconds value | 设置指定key的值,并将key值的过期时间设为seconds秒 |
SETNX key value | 只有key不存在时设置key的值 |
https://redis.net.cn
中会有更多教程
2、Hash
HSET key field value | 将哈希表key中的字段field的值设为value |
---|---|
HGET key field | 获取存储在哈希表中指定字段的值 |
HDEL key field | 删除存储在哈希表中的指定字段 |
HKEYS key | 获取哈希表中指定key的所有的字段 |
HVALS key | 获取哈希表中指定key的所有的值 |
HGETALL key | 获取在哈希表中指定key的所有字段和值 |
3、List
LPUSH key value1 [value2…] | 将一个或者多个值插入到列表头部 |
---|---|
LRANGE key start stop | 获取列表指定范围内的元素 -1 代表查所有 |
RPOP key | 移除并获取列表最后一个元素 |
LLEN key | 获取列表的长度 |
BRPOP key1 [key2] timeout | 移除并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
4、Set
Redis set 是String类型的无序集合
,集合成员是唯一的,这就意味着集合中不能出现重复的数据。
SADD key member1 [member2]… | 向集合中添加一个或多个成员 |
---|---|
SMEMBER key | 返回集合中的所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回所有给定集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SDIFF key1 [key2] | 返回所有给定集合的差集 |
SREM key member1 [menber2] | 移除集合中一个或者多个成员 |
5、sorted set
Redis sorted set 有序集合
是string类型元素的集合,不重复。
每个元素会关联一个double类型的分数(score)
,redis正式通过分数来为集合中的成员进行小到大的排序。
成员唯一,但是分数可以重复。
ZADD key score1 member1 [score2 member2] | 向有序集合中添加一个或者多个成员 或者更新已经存在成员的分数 |
---|---|
ZRANGE key start stop [withscores] | 通过索引区间返回有序集合中指定区间的成员 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量increment |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
通用命令
KEYS pattern #查找所有符合给定模式的key
EXISTS key #检查给定key是否存在
TYPE key #返回key所储存的值的类型
TTL key #返回给定key的剩余生存时间(time to live),以秒s为单位
DEL key #该命令用于在key存在时,删除key
redis 两种方式的使用
1、redisTemplate
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
yml
配置文件redis: host: 172.16.124.130 #远程连接的ip 修改了固定的ip地址 port: 6379 #端口 password: 123456 #密码 database: 0 #0号数据库 timeout: 3000 cache: redis: time-to-live: 1800000 #设置缓存的过期时间30分钟
-
在config目录下编写RedisConfig配置类
,重新覆盖序列化的配置,防止乱码的情况发生。@Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); // 默认的Key序列华器为: JdkSerializationRedisSerializer() 可能会出现类似乱码的符号 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } }
-
在需要添加redis缓存的
Controller
中引入RedisTemplate
的自动装配。@Autowired private RedisTemplate redisTemplate;
-
具体逻辑
-
将用户
登录页面的验证码
存入redisredisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES); //以电话为key,验证码为值,5分钟有效期
-
在
查询,添加,修改,删除
的操作中都需要操作redis查询
:先查询redis中的缓存,没有的话再查询数据库,并存入缓存。List<DishDto> dishDtoList = null; //动态构造key String key = "dish_"+dish.getCategoryId()+"_"+dish.getStatus(); //先从redis中获取缓存数据 dishDtoList = (List<DishDto>) redisTemplate.opsForValue().get(key); if (dishDtoList != null){ //若存在,则直接返回,无需查询数据库 return R.success(dishDtoList); } //若不存在,则先构造条件查询数据库,最后再存到redis中 ...查询数据库... //查询完毕,将查询出的数据存储到redis缓存中。 redisTemplate.opsForValue().set(key,dishDtoList,60, TimeUnit.MINUTES); //60分钟的有效期 return R.success(dishDtoList);
添加、修改、删除
操作完成时,要清除所有缓存(比较保险),或清除操作的数据的缓存(比较高效)。//清理所有的缓存 Set keys = redisTemplate.keys("dish_*"); redisTemplate.delete(keys); /*------------------上下选其一---------------------------*/ //清理添加菜品所在分类的缓存 String key = "dish_"+dishDto.getCategoryId()+"_1"; redisTemplate.delete(key);
-
2、注解(spring cache)
-
添加依赖(上面的data-redis也是需要的)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
-
主启动类上加注解
@EnableCaching
以开启缓存注解功能的使用。@Slf4j @ServletComponentScan //扫描@WebFilter注解的类 @SpringBootApplication @EnableTransactionManagement //开始事务注解的支持,对于操作多张表的操作需要开始事务注解 @EnableCaching //开启spring-cache的注解方式的缓存功能 public class DemoSpringBootApplication { public static void main(String[] args) { SpringApplication.run(ReggieTakeOutApplication.class, args); //log需要与lombok提供的@Slf4j一起使用 log.info("项目启动成功!!!"); } }
-
在方法上添加注解,cacheName可以自己设置
//执行方法时清除所有缓存(增删改) @CacheEvict(value = "cacheName", allEntries = true) //执行方法时根据设置的key去查询,如果缓存没有则从数据库中查询,并添加至缓存。(查) @Cacheable(value = "cacheName", key = "#id")