0%

Redis汇总

TodoItem

那些数据适合存储进去? todo

维护的增删改查应不应该放弃使用缓存(只是为了不出现一种情况,就是修改了数据库,缓存依然还是老的数据)
另外还要考虑到维护的时候增删改其实使用的频率是不多的,所有没必要使用缓存,当然,高频率增删改的除外。
使用到缓存的一般是可以是高频率的查询

Basic Knowledge

redis数据持久化,一般重启不丢失

https://redis.io/topics/persistence
会默认开启RDB 持久化

Redis的数据类型

  1. 字符串(String)
  2. 字符串列表(list)
  3. 有序字符串集合(sorted set)
  4. 哈希(hash)
  5. 字符串集合(set)

常用命令

https://www.runoob.com/redis/redis-commands.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
查询键keys * 查询所有的键,会遍历所有的键值,复杂度O(n)
flushall
incr num
decr num
incrby num 5
decrby num 3
append num str
hset myhash keyname value
hmset myhashs key1 v1 key2 v2
hget myhashs key1
hmget myhashs key1 key2
hgetall myhashs
hdel myhashs key1 key2
hlen myhashs
hkeys myhashs
hvals myhashs
lpush mylist a b c (左侧添加进去)
rpush mylist 1 2 3 (右侧添加进去)
lrange mylist 0 -1 (负数是倒数第n)
lpop mylist (弹出首个)
rpop mylist(弹出尾个)
llen mylist
lpushx mylist x (插入到头部)
rpushx mylist x(插入到尾部)
lrem mylist 2 3 (从头到尾删除2个值为3的元素)
lrem mylist -2 3 (从尾到头删除2个值为3的元素)
lrem mylist 0 3 (删除所有值为3的元素)
lset mylist 3 mmm(在下标为3的位置插入mmm)
linsert mylist before mmm haha(在第一个mmm之前插入haha)
linsert mylist after mmm xixi(在第一个mmm之后插入xixi)
rpoplpush mylist1 mylist2 (mylist1弹出首个元素给到mylist2)
sadd myset a b c
sismember myset a(判断是否成员)
sdiff myset1 myset2(差集)
sinter myset1 myset2(交集)
sunion set1 set2 (并集)
smembers myset
scard myset

过期时间

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
2
3
4
pidfile /var/run/redis_6379.pid
port 6379
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/637￿9

dir注意要新建对应目录

复制多个redis-server

1
cp /etc/init.d/redis-server /etc/init.d/redis-server02

修改redis-service02里面的内容,例如:

1
2
3
4
DAEMON_ARGS=/usr/local/redis/etc/redis02.conf
NAME=redis-server02
DESC=redis-server02
PIDFILE=/var/run/redis/redis02.pid

然后启动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接口。

Redisson实现分布式锁