Redis修炼宝典
CAP定理
一致性 可用性 分区容错性
redis持久化机制
RDB (redis database)
原理:
利用时间点快照技术 point-in-time snapshot 保存了redis某个时间点上的数据;
在N秒内数据集至少有M个改动 这一条件就自动保存数据集;
怎么使用:
手动执行命令执行RDB 进入客户端save 或者bgsave 新的文件会覆盖原有的文件
使用bgsava命令时执行的是COW机制(copy on write), 异步 非阻塞
原理(fork COW):
fork 创建一个子进程 这个子进程共享父类中的数据(有时刻性) 在这个时刻后这两个进程都互不影响 主进程挂了 子线程也跟着挂了 子线程用于持久化操作,主进程提供对外合作
COW save 同步 阻塞
AOF (append only file)
记录日志的方式 把操作指令持续写到一个类似日志文件内 appendonly.aof 重启后通过重新执行这些命令来还原数据操作。
1.实时数据备份,安全
2..AOF文件体积大
3.执行速度慢
4.持久化速度比RDB慢
手动bgrewriteao 生成aof文件[note]AOF和RDB同时开启时AOF的优先级更高
常用命令
自己百度去
redis应用
redis主从复制 集群构建
读写分离--业务区分
哨兵模式 --监听 redis 安全机制
redis事物 multi exec
redis集群搭建
缓存穿透
缓存一般都是通过key去查找value,如果不存在对应的value,就要去数据库中查找,如果这个key对应的value在数据库中不存在,
并且访问这个key数据并发量也很大,就会对数据库产生压力。这就是缓存穿透
解决方案 布隆过滤器
布隆过滤器 庞大的数据中是否含有某个元素
缓存雪崩
缓存重启或者缓存在某一段失效,造成数据库瞬间的访问量增大,造成缓存雪崩
加锁或者队列控制数据库缓存的进程量
设置不同的过期时间,缓存点均匀分布
二级缓存
redis值的生存时间redis底层原理分析
hash槽 存储方式
redis核心数据结构剖析
待看
Redis应用场景
1.String
-- 单值缓存
-- 对象缓存
-- 分布式锁
-- 计数器
-- Web集群session共享
-- 分布式系统全局序列号
2.List
-- 微信公共号 信息流
3.set
-- 抽奖小程序
-- 关注模型
4.Zset
-- 点击计数
-- 排行榜
5.Hash
-- 对象缓存
-- 电商购物车Redis是单线程吗?
Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
Redis 单线程为什么还能这么快?
因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
Redis 单线程如何处理那么多的并发客户端连接?
Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
Redis五种存储类型
百度廖志伟博客 图解很好理解
快链 https://blog.csdn.net/java_wxid/category_8600390.html
代码敲敲乐
package com.springbootweb.webapp.springDateRedis;
/**
* @author Liyongzhe
* @date 2021/3/18_10:21
*/
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Set;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class testSet {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 存入值
*/
@Test
public void setValue(){
redisTemplate.boundSetOps("nameset").add("曹操");
redisTemplate.boundSetOps("nameset").add("刘备");
redisTemplate.boundSetOps("nameset").add("孙权");
}
/**
* 提取值
*/
@Test
public void getValue(){
Set<String> members = redisTemplate.boundSetOps("nameset").members();
System.out.println(members);
}
/**
* 删除集合中的某一个值
*/
@Test
public void deleteValue(){
redisTemplate.boundSetOps("nameset").remove("孙权");
}
/**
* 删除整个集合
*/
@Test
public void deleteAllValue(){
redisTemplate.delete("nameset");
}
}
package com.springbootweb.webapp.springDateRedis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Liyongzhe
* @date 2021/3/17_16:50
*/
//让测试运行于Spring测试环 境,以便在测试开始的时候自动创建Spring的应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestValue {
@Autowired
private RedisTemplate redisTemplate;
//添加值
@Test
public void setValue(){
redisTemplate.boundValueOps("String_key").set("String_values");
}
//取值
@Test
public void getValue(){
String str = (String) redisTemplate.boundValueOps("String_key").get();
System.out.println("String_key: "+str);
}
//删除值
@Test
public void deleteValue(){
redisTemplate.delete("String_key");
}
}
redisConfig.properties
#主机连接地址 redis.host=127.0.0.1 #连接端口 redis.port=6379 redis.pass= redis.database=0 redis.maxIdle=300 redis.maxWait=3000 redis.testOnBorrow=true
applicationContext-redis.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath*:properties/*.properties" />
<!-- 配置redis相关信息连接池 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}"/>
<property name="maxWaitMillis" value="${redis.maxWait}" />
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:poolConfig-ref="poolConfig"></bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>
</beans> 
