watch:监听
我们正在做一个事情,怕有人干扰;所以如果我在做一个事情,如果有人影响我了,我这个事情就全部直接失败,不要成功,因为我怕结果最后不对。
watch就是监听一个key,我要操作的时候经过这个key,别人操作也要经过这个key;那么我在监听这个key,如果有人修改了这个key里面的内容,那么我就让我做的所有事情全部失败,我担心数据被人改了,数据不安全了,可以用来做分布式锁的一部分
watch item100 监听这个100的商品
然后我要开始做事务了
set a a
set b b
set c c
然后这期间没有任何人修改,我提交事务,我就成功了
然后另一种情况
watch item100
set d d
set e e
此时另一个线程也来操作
set item100 a
修改了item
然后我提交事务的时候,会全部失败
Redis持久化机制
redis中的数据是在内存中放置的,但是为了保证数据的安全,会把数据持久化到磁盘上,这样你重启完redis后数据还会在,不然一重启就没有了
持久化机制的方式:
RDB(Redis DataBase)这是默认持久化方式
| 要点 | 说明 |
| 文件类型 | 二进制的文件,存储快,易传输 |
| 持久化时机 | save 900 1,在900s内有一个key发生了变化,执行RDB持久化 |
| save 300 10,在300s内有10个key发生了变化,执行RDB持久化 | |
| save 60 10000,在60s内有1w个key发生了变化,执行RDB持久化 | |
| 缺点 | RDB无法保证数据的绝对安全 |
AOF(Appendonly File)
| 要点 | 说明 |
| 文件类型 | 文本文件,相对RDB更安全;推荐同时开启AOF和RDB |
| 持久化机制 | appendfsync always,每执行一个写操作,立即持久化到AOF文件中 |
| appendfsync everysec,每秒执行一次持久化 | |
| appendfsync no,根据系统和环境,一定时间内执行一次持久化 | |
| 缺点 | 后期文件较大,传输困难 |
SSM整合redis
首先查询数据库,如果有数据,则返回给用户,如果没有数据,就查询数据库,然后把数据保存到redis中一份
1.先在xml中搞个对象
<bean class="redis.clients.jedis.JedisPoolConfig" id="jedisPoolConfig">
<property name="maxIdle" value="100" />
<property name="maxTotal" value="512" />
<property name="minIdle" value="10" />
<property name="maxWaitMillis" value="5000" />
</bean><bean class="redis.clients.jedis.JedisPool" id="jedisPool">
<constructor-arg name="PoolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="你的localhost" />
<constructor-arg name="port" value="你的端口" />
<constructor-arg name="timeout" value="5000" />
<constructor-arg name="password" value="你的密码" />
</bean>
然后注入一下就可以了
2.查询redis
Jedis jedis = jedisPool.getResource(); //创建连接对象
3.问题:对象应该用什么数据放到缓存中?因为数据第一次查的话肯定不会在缓存中
答:用json
/*
先查询,jedis.get(key)如果有数据,就返回给用户
如果没有就去数据库中查询,把查询的结果转换成json保存到缓存
*/public MemberBorrowInfo getMemberById(long id) throws Exception(){MemberBorrowInfo borrowInfo = null;Jedis jedis = jedisPool.getResource(); //缓存连接池String infoJson = jedis.get("borrowInfo:" + id); //查询缓存if(infoJson == null){ //如果缓存中没有就查询数据库System.err.println("查询数据库");borrowInfo = borrowInfoMapper.getMemberById(id); //String borrowinfoJson = objectMapper.writeValueAsString(borrowInfo);//writeValueAsString :用来把Java对象转化为jsonjedis.set("borrowinfo:" + id,borrowinfoJson);}else{borrowInfo = objectMapper.readValue(infoJson,MemberBorrowInfo.class); //如果有就直接返回给用户}jedis.close();return borrowInfo;
}
Redis中的主从模式
为了防止我们的数据库坏掉之后数据丢失,所以需要主从模式
在主从复制中数据库分为主数据库和从数据库,从数据库一般都是只读的,并且接收从主数据库同步过来的数据;一个主可以有多个从,但是一个从只能有一个主,从数据库故障不影响其他从的读和主的读和写;主数据库的故障不影响从的读,但是redis不再提供写服务,因为怕数据出现错乱
配置:
只需要启动多个redis
在从系的redis里写上
replicaof 主ip 主redis端口
哨兵
哨兵建立在主从模式的基础上
哨兵可以解决主从架构中饿单点故障问题
当主宕机之后,哨兵会去从里选一个新的主
原来的主恢复后会变成从
多个哨兵形成集群,互相监控每个redis里都会有一个哨兵
Redis集群
集群是主从+哨兵的模式
集群是无中心的
集群是投票机制,节点数量必须是奇数
集群节点默认分配16384个哈希槽
为了保证安全,每个节点至少有一个从节点