当前位置: 代码迷 >> 综合 >> Redis(个人笔记)
  详细解决方案

Redis(个人笔记)

热度:36   发布时间:2024-02-09 17:33:23.0

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个哈希槽
为了保证安全,每个节点至少有一个从节点