TodoItem
那些数据适合存储进去? todo
维护的增删改查应不应该放弃使用缓存(只是为了不出现一种情况,就是修改了数据库,缓存依然还是老的数据)
另外还要考虑到维护的时候增删改其实使用的频率是不多的,所有没必要使用缓存,当然,高频率增删改的除外。
使用到缓存的一般是可以是高频率的查询
Basic Knowledge
redis数据持久化,一般重启不丢失
https://redis.io/topics/persistence
会默认开启RDB 持久化
Redis的数据类型
- 字符串(String)
- 字符串列表(list)
- 有序字符串集合(sorted set)
- 哈希(hash)
- 字符串集合(set)
常用命令
https://www.runoob.com/redis/redis-commands.html
1 | 查询键keys * 查询所有的键,会遍历所有的键值,复杂度O(n) |
过期时间
https://www.cnblogs.com/xiaoxiongcanguan/p/9937433.html?utm_source=tuicool&utm_medium=referral
redis-cli
1 | redis-cli -h 地址 -p 端口号 |
Redis与IO之间的关系和工作原理
Problem Solution
required a bean of type ‘org.springframework.cache.CacheManager’ that could not be found.
需要再spring.foctories添加org.springframework.boot.autoconfigure.EnableAutoConfiguration配置,
至少需要配置RedisTemplate
MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
网上说:关闭配置文件里面的stop-writes-on-bgsave-error,将其配置为no,然后重启redis,但是改成no之后刚开始能生效,隔一段时间之后还是会报这个错,所以问题的根源应该不是这个。
Redis系列之一台机器启动多个服务
复制多个redis.conf
1 | cp /usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis02.conf |
修改redis02.conf内容防止冲突,例如:
1 | pidfile /var/run/redis_6379.pid |
dir注意要新建对应目录
复制多个redis-server
1 | cp /etc/init.d/redis-server /etc/init.d/redis-server02 |
修改redis-service02里面的内容,例如:
1 | DAEMON_ARGS=/usr/local/redis/etc/redis02.conf |
然后启动redis-service02
1 | ./redis-serivce02 start |
MySQL操作成功之后Redis操作失败的回滚问题
在项目中有个需求,需要保证MySQL数据库和Redis缓存数据的一致性。
一般增删改都是先操作MySQL数据库,成功之后再操作Redis,但这里有个问题,如果MySQL操作成功了,但Redis突然出现异常,操作失败,如何回滚MySQL操作。
使用注解@Transactional只会回滚MySQL异常的情况,Redis本身也不具备回滚功能,在MySQL操作成功的情况下,@Transactional注解会认为方法并没有异常,会继续执行而不回滚,这样就导致了MySQL和Redis不一致的情况。
为了避免这种情况,每次操作Redis之后,都会判断Redis有没有操作成功,操作失败则进行手动回滚,加一行代码:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 配合@Transactional注解即可解决问题。
redis缓存设计
要点
- 注意纳入redis管控的JavaBean一定要实现Serializable接口,这样才能序列化。JavaBean的子属性如果是JavaBean也都要实现Serializable接口。