当前位置: 首页 > news >正文

沁阳建网站用wordpress做淘宝

沁阳建网站,用wordpress做淘宝,如何提高你的网站的粘性,百度收录查询✅作者简介#xff1a;CSDN内容合伙人、信息安全专业在校大学生#x1f3c6; #x1f525;系列专栏 #xff1a;【狂神说Java】 #x1f4c3;新人博主 #xff1a;欢迎点赞收藏关注#xff0c;会回访#xff01; #x1f4ac;舞台再大#xff0c;你不上台#xff0c… ✅作者简介CSDN内容合伙人、信息安全专业在校大学生 系列专栏 【狂神说Java】 新人博主 欢迎点赞收藏关注会回访 舞台再大你不上台永远是个观众。平台再好你不参与永远是局外人。能力再大你不行动只能看别人成功没有人会关心你付出过多少努力撑得累不累摔得痛不痛他们只会看你最后站在什么位置然后羡慕或鄙夷。 文章目录 Jedis什么是Jedis导入依赖修改配置idea连接并操作事务常用api SpringBoot整合导入依赖编写配置文件使用RedisTemplate测试结果定制RedisTemplate模板 自定义Redis工具类 持久化RDB什么是RDB工作原理触发机制RDB优缺点 AOF什么是AOF优点和缺点 RDB和AOP选择 Redis发布与订阅命令示例原理缺点应用 Redis主从复制概念作用为什么使用集群环境配置一主二从配置使用规则 哨兵模式哨兵的作用哨兵模式优缺点 缓存穿透与雪崩缓存穿透概念解决方案 缓存击穿量太大缓存过期概念解决方案 缓存雪崩概念解决方案 Jedis 我们要使用java来操作Redis 什么是Jedis Jedis是Redis官方推荐的java连接开发工具使用java操作Redis中间件如果要使用Java操作Redis要对Jedis十分熟悉 导入依赖 !--导入jredis的包--dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.3.0/version/dependency!--fastjson--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.83/version/dependency修改配置 1修改redis的配置文件 vim /usr/local/bin/redis-20231111.conf取消只绑定本地注释注解掉那个bind127.0.0.0保护模式改为protected-mode no允许后台运行 daemonize yes 2开放端口6379 firewall-cmd --zonepublic --add-port6379/tcp --permanet或者直接关掉防火墙 service firewalld stop service stop iptables3重启防火墙服务 systemctl restart firewalld.service4去阿里云服务器控制台配置安全组 5重启redis-server 启动要设置配置文件目录 redis-server redis-20231111.confidea连接并操作 public class TestPing {public static void main(String[] args) {Jedis jedis new Jedis(192.168.3.22, 6379);String response jedis.ping();System.out.println(response); // PONG} }事务 public class TestTX {public static void main(String[] args) {Jedis jedis new Jedis(192.168.3.22, 6379);JSONObject jsonObject new JSONObject();jsonObject.put(hello, world);jsonObject.put(name, kuangshen);// 开启事务Transaction multi jedis.multi();String result jsonObject.toJSONString();// jedis.watch(result)try {multi.set(user1, result);multi.set(user2, result);// 执行事务multi.exec();}catch (Exception e){// 放弃事务multi.discard();} finally {// 关闭连接System.out.println(jedis.get(user1));System.out.println(jedis.get(user2));jedis.close();}} }常用api import redis.clients.jedis.Jedis;public class JedisType {public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);System.out.println( String );System.out.println(jedis.set(name, zs));System.out.println(jedis.get(name));System.out.println(jedis.append(name, value));System.out.println(jedis.get(name));System.out.println(jedis.strlen(name));System.out.println( List );System.out.println(jedis.lpush(listKey, l1, l2, l3));System.out.println(jedis.lrange(listKey, 0, -1)); // [l3, l2, l1]System.out.println(jedis.llen(listKey));System.out.println( Hash );System.out.println(jedis.hset(hashKey, k1, v1));System.out.println(jedis.hset(hashKey, k2, v2));System.out.println(jedis.hset(hashKey, k3, v3));System.out.println(jedis.hmget(hashKey, k1, k2, k3)); // [v1, v2, v3]System.out.println(jedis.hgetAll(hashKey)); // {k3v3, k2v2, k1v1}System.out.println( Set );System.out.println(jedis.sadd(setKey, s1, s2, s3, s4));System.out.println(jedis.smembers(setKey)); // [s2, s1, s4, s3]System.out.println(jedis.scard(setKey));System.out.println( Zset );System.out.println(jedis.zadd(ZKey, 90, z1));System.out.println(jedis.zadd(ZKey, 80, z2));System.out.println(jedis.zadd(ZKey, 85, z3));System.out.println(jedis.zrange(ZKey, 0, -1)); // [z2, z3, z1]} } import java.util.Set; import redis.clients.jedis.Jedis;public class TestKey {public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);System.out.println(清空数据 jedis.flushDB());System.out.println(判断某个键是否存在 jedis.exists(username));System.out.println(新增username,kuangshen的键值对 jedis.set(username, kuangshen));System.out.println(新增password,password的键值对 jedis.set(password, password));System.out.print(系统中所有的键如下);SetString keys jedis.keys(*);System.out.println(keys);System.out.println(删除键password: jedis.del(password));System.out.println(判断键password是否存在 jedis.exists(password));System.out.println(查看键username所存储的值的类型 jedis.type(username));System.out.println(随机返回key空间的一个 jedis.randomKey());System.out.println(重命名key jedis.rename(username, name));System.out.println(取出改后的name jedis.get(name));System.out.println(按索引查询 jedis.select(0));System.out.println(删除当前选择数据库中的所有key jedis.flushDB());System.out.println(返回当前数据库中key的数目 jedis.dbSize());System.out.println(删除所有数据库中的所有key jedis.flushAll());jedis.connect();jedis.disconnect();jedis.flushAll();} } import java.util.concurrent.TimeUnit; import redis.clients.jedis.Jedis;public class TestString {public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);jedis.flushDB();System.out.println(增加数据);System.out.println(jedis.set(key1, value1));System.out.println(jedis.set(key2, value2));System.out.println(jedis.set(key3, value3));System.out.println(删除键key2: jedis.del(key2));System.out.println(获取键key2: jedis.get(key2));System.out.println(修改key1: jedis.set(key1, value1Changed));System.out.println(获取key1的值 jedis.get(key1));System.out.println(在key3后面加入值 jedis.append(key3, End));System.out.println(key3的值 jedis.get(key3));System.out.println(增加多个键值对 jedis.mset(new String[]{key01, value01, key02, value02, key03, value03}));System.out.println(获取多个键值对 jedis.mget(new String[]{key01, key02, key03}));System.out.println(获取多个键值对 jedis.mget(new String[]{key01, key02, key03, key04}));System.out.println(删除多个键值对 jedis.del(new String[]{key01, key02}));System.out.println(获取多个键值对 jedis.mget(new String[]{key01, key02, key03}));jedis.flushDB();System.out.println(新增键值对防止覆盖原先值);System.out.println(jedis.setnx(key1, value1));System.out.println(jedis.setnx(key2, value2));System.out.println(jedis.setnx(key2, value2-new));System.out.println(jedis.get(key1));System.out.println(jedis.get(key2));System.out.println(新增键值对并设置有效时间);System.out.println(jedis.setex(key3, 2, value3));System.out.println(jedis.get(key3));try {TimeUnit.SECONDS.sleep(3L);} catch (InterruptedException var3) {var3.printStackTrace();}System.out.println(jedis.get(key3));System.out.println(获取原值更新为新值);System.out.println(jedis.getSet(key2, key2GetSet));System.out.println(jedis.get(key2));System.out.println(获得key2的值的字串 jedis.getrange(key2, 2L, 4L));} } import redis.clients.jedis.Jedis;public class TestList {public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);jedis.flushDB();System.out.println(添加一个list);jedis.lpush(collections, new String[]{ArrayList, Vector, Stack, HashMap, WeakHashMap, LinkedHashMap});jedis.lpush(collections, new String[]{HashSet});jedis.lpush(collections, new String[]{TreeSet});jedis.lpush(collections, new String[]{TreeMap});System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(collections区间0-3的元素 jedis.lrange(collections, 0L, 3L));System.out.println();System.out.println(删除指定元素个数 jedis.lrem(collections, 2L, HashMap));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(删除下表0-3区间之外的元素 jedis.ltrim(collections, 0L, 3L));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(collections列表出栈左端 jedis.lpop(collections));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(collections添加元素从列表右端与lpush相对应 jedis.rpush(collections, new String[]{EnumMap}));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(collections列表出栈右端 jedis.rpop(collections));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println(修改collections指定下标1的内容 jedis.lset(collections, 1L, LinkedArrayList));System.out.println(collections的内容 jedis.lrange(collections, 0L, -1L));System.out.println();System.out.println(collections的长度 jedis.llen(collections));System.out.println(获取collections下标为2的元素 jedis.lindex(collections, 2L));System.out.println();jedis.lpush(sortedList, new String[]{3, 6, 2, 0, 7, 4});System.out.println(sortedList排序前 jedis.lrange(sortedList, 0L, -1L));System.out.println(jedis.sort(sortedList));System.out.println(sortedList排序后 jedis.lrange(sortedList, 0L, -1L));} } import redis.clients.jedis.Jedis;public class TestSet {public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);jedis.flushDB();System.out.println(向集合中添加元素不重复);System.out.println(jedis.sadd(eleSet, new String[]{e1, e2, e4, e3, e0, e8, e7, e5}));System.out.println(jedis.sadd(eleSet, new String[]{e6}));System.out.println(jedis.sadd(eleSet, new String[]{e6}));System.out.println(eleSet的所有元素为 jedis.smembers(eleSet));System.out.println(删除一个元素e0 jedis.srem(eleSet, new String[]{e0}));System.out.println(eleSet的所有元素为 jedis.smembers(eleSet));System.out.println(删除两个元素e7和e6 jedis.srem(eleSet, new String[]{e7, e6}));System.out.println(eleSet的所有元素为 jedis.smembers(eleSet));System.out.println(随机的移除集合中的一个元素 jedis.spop(eleSet));System.out.println(随机的移除集合中的一个元素 jedis.spop(eleSet));System.out.println(eleSet的所有元素为 jedis.smembers(eleSet));System.out.println(eleSet中包含元素的个数 jedis.scard(eleSet));System.out.println(e3是否在eleSet中 jedis.sismember(eleSet, e3));System.out.println(e1是否在eleSet中 jedis.sismember(eleSet, e1));System.out.println(e1是否在eleSet中 jedis.sismember(eleSet, e5));System.out.println();System.out.println(jedis.sadd(eleSet1, new String[]{e1, e2, e4, e3, e0, e8, e7, e5}));System.out.println(jedis.sadd(eleSet2, new String[]{e1, e2, e4, e3, e0, e8}));System.out.println(将eleSet1中删除e1并存入eleSet3中 jedis.smove(eleSet1, eleSet3, e1));System.out.println(将eleSet1中删除e2并存入eleSet3中 jedis.smove(eleSet1, eleSet3, e2));System.out.println(eleSet1中的元素 jedis.smembers(eleSet1));System.out.println(eleSet3中的元素 jedis.smembers(eleSet3));System.out.println(集合运算);System.out.println(eleSet1中的元素 jedis.smembers(eleSet1));System.out.println(eleSet2中的元素 jedis.smembers(eleSet2));System.out.println(eleSet1和eleSet2的交集: jedis.sinter(new String[]{eleSet1, eleSet2}));System.out.println(eleSet1和eleSet2的并集: jedis.sunion(new String[]{eleSet1, eleSet2}));System.out.println(eleSet1和eleSet2的差集: jedis.sdiff(new String[]{eleSet1, eleSet2}));jedis.sinterstore(eleSet4, new String[]{eleSet1, eleSet2});System.out.println(eleSet4中的元素 jedis.smembers(eleSet4));} } import java.util.HashMap; import java.util.Map; import redis.clients.jedis.Jedis;public class TestHash {public TestHash() {}public static void main(String[] args) {Jedis jedis new Jedis(127.0.0.1, 6379);jedis.flushDB();MapString, String map new HashMap();map.put(key1, value1);map.put(key2, value2);map.put(key3, value3);map.put(key4, value4);jedis.hmset(hash, map);jedis.hset(hash, key5, value5);System.out.println(散列hash的所有键值对为 jedis.hgetAll(hash));System.out.println(散列hash的所有键为 jedis.hkeys(hash));System.out.println(散列hash的所有值为 jedis.hvals(hash));System.out.println(将key6保存的值加上一个整数如果key6不存在则添加key6 jedis.hincrBy(hash, key6, 6L));System.out.println(散列hash的所有键值对为 jedis.hgetAll(hash));System.out.println(将key6保存的值加上一个整数如果key6不存在则添加key6 jedis.hincrBy(hash, key6, 3L));System.out.println(散列hash的所有键值对为 jedis.hgetAll(hash));System.out.println(删除一个或者多个键值对 jedis.hdel(hash, new String[]{key2}));System.out.println(散列hash的所有键值对为 jedis.hgetAll(hash));System.out.println(散列hash中键值对的个数 jedis.hlen(hash));System.out.println(判断hash中是否存在key2 jedis.hexists(hash, key2));System.out.println(判断hash中是否存在key3 jedis.hexists(hash, key3));System.out.println(获取hash中的值 jedis.hmget(hash, new String[]{key3}));System.out.println(获取hash中的值 jedis.hmget(hash, new String[]{key3, key4}));} } SpringBoot整合 导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId /dependency编写配置文件 # 配置redis spring.redis.hostxxx.xxx.xxx.xxx spring.redis.port6379使用RedisTemplate SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTemplate redisTemplate;Testvoid contextLoads() {// redisTemplate 操作不同的数据类型api和我们的指令是一样的// opsForValue 操作字符串 类似String// opsForList 操作List 类似List// opsForHah// 除了基本的操作我们常用的方法都可以直接通过redisTemplate操作比如事务和基本的CRUD// 获取连接对象//RedisConnection connection redisTemplate.getConnectionFactory().getConnection();//connection.flushDb();//connection.flushAll();redisTemplate.opsForValue().set(mykey,kuangshen);System.out.println(redisTemplate.opsForValue().get(mykey));} }测试结果 回到redis查看数据发现全是乱码但是控制台可以正常输出 这时候就关系到存储对象的序列化问题在网络中传输的对象也是一样需要序列化否者就全是乱码。 默认的序列化器是采用JDK序列化器后续我们定制RedisTemplate就可以对其进行修改。 定制RedisTemplate模板 Configuration public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {// 将template 泛型设置为 String, ObjectRedisTemplateString, Object template new RedisTemplate();// 连接工厂不必修改template.setConnectionFactory(redisConnectionFactory);/** 序列化设置*/// key、hash的key 采用 String序列化方式template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// value、hash的value 采用 Jackson 序列化方式template.setValueSerializer(RedisSerializer.json());template.setHashValueSerializer(RedisSerializer.json());template.afterPropertiesSet();return template;} }这样只要实体类进行了序列化我们存什么都不会有乱码的担忧了。 自定义Redis工具类 使用RedisTemplate需要频繁调用.opForxxx然后才能进行对应的操作这样使用起来代码效率低下工作中一般不会这样使用而是将这些常用的公共API抽取出来封装成为一个工具类然后直接使用工具类来间接操作Redis,不但效率高并且易用。 工具类参考文档 SpringBoot整合Redis及Redis工具类撰写 - zeng1994 - 博客园 java redisUtils工具类很全 - 静静别跑 - 博客园 持久化 RDB 什么是RDB 在指定时间间隔后将内存中的数据集快照写入数据库 在恢复时候直接读取快照文件进行数据的恢复 默认情况下 Redis 将数据库快照保存在名字为** dump.rdb**的二进制文件中。文件名可以在配置文件中进行自定义。 工作原理 在进行RDB的时候redis的主线程是不会做io操作的主线程会fork一个子线程来完成该操作 Redis 调用forks。同时拥有父进程和子进程。子进程将数据集写入到一个临时 RDB 文件中。当子进程完成对新 RDB 文件的写入时Redis 用新 RDB 文件替换原来的 RDB 文件并删除旧的 RDB 文件。 这种工作方式使得 Redis 可以从写时复制copy-on-write机制中获益(因为是使用子进程进行写操作而进程依然可以接收来自客户端的请求。) 触发机制 save的规则满足的情况下会自动触发rdb原则执行flushall命令也会触发我们的rdb原则退出redis也会自动产生rdb文件 save 使用save命令会立刻对当前内存中的数据进行持久化 ,但是会阻塞也就是不接受其他操作了 由于save 命令是同步命令会占用Redis的主进程。若Redis数据非常多时save命令执行速度会非常慢阻塞所有客户端的请求。 flushall命令 flushall命令也会触发持久化 触发持久化规则 可以通过配置文件redis.conf 对 Redis 进行设置 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时 自动进行数据集保存操作。 bgsave bgsave是异步进行进行持久化的时候redis 还可以将继续响应客户端请求 bgsave和save对比 RDB优缺点 优点 适合大规模的数据恢复对数据的完整性要求不高 缺点 需要一定的时间间隔进行操作如果redis意外宕机了这个最后一次修改的数据就没有了。fork进程的时候会占用一定的内容空间。 AOF Append Only File 将我们所有的命令都记录下来history恢复的时候就把这个文件全部再执行一遍 什么是AOF 快照功能RDB并不是非常耐久durable 如果 Redis 因为某些原因而造成故障停机 那么服务器将丢失最近写入、以及未保存到快照中的那些数据。 从 1.1 版本开始 Redis 增加了一种完全耐久的持久化方式 AOF 持久化。 如果要使用AOF需要修改配置文件 **appendonly yes **则表示启用AOF 默认是不开启的我们需要手动配置然后重启redis。在大部分的情况下rdb完全够用 如果这个aof文件有错位这时候redis是启动不起来的我需要修改这个aof文件 redis给我们提供了一个修复的工具 redis-check-aof --fix 优点和缺点 优点 每一次修改都会同步文件的完整性会更加好没秒同步一次可能会丢失一秒的数据从不同步效率最高 缺点 相对于数据文件来说aof远远大于rdb修复速度比rdb慢Aof运行效率也要比rdb慢所以我们redis默认的配置就是rdb持久化 RDB和AOP选择 如何选择使用哪种持久化方式 一般来说 如果想达到足以媲美 PostgreSQL 的数据安全性 你应该同时使用两种持久化功能。 如果你非常关心你的数据 但仍然可以承受数分钟以内的数据丢失 那么你可以只使用 RDB 持久化。 有很多用户都只使用 AOF 持久化 但并不推荐这种方式 因为定时生成 RDB 快照snapshot非常便于进行数据库备份 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 Redis发布与订阅 Redis 发布订阅(pub/sub)是一种消息通信模式发送者(pub)发送消息订阅者(sub)接收消息。 下图展示了频道 channel1 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系 当有新消息通过 PUBLISH 命令发送给频道 channel1 时 这个消息就会被发送给订阅它的三个客户端 命令 示例 ------------订阅端---------------------- 127.0.0.1:6379 SUBSCRIBE sakura # 订阅sakura频道 Reading messages... (press Ctrl-C to quit) # 等待接收消息 1) subscribe # 订阅成功的消息 2) sakura 3) (integer) 1 1) message # 接收到来自sakura频道的消息 hello world 2) sakura 3) hello world 1) message # 接收到来自sakura频道的消息 hello i am sakura 2) sakura 3) hello i am sakura--------------消息发布端------------------- 127.0.0.1:6379 PUBLISH sakura hello world # 发布消息到sakura频道 (integer) 1 127.0.0.1:6379 PUBLISH sakura hello i am sakura # 发布消息 (integer) 1-----------------查看活跃的频道------------ 127.0.0.1:6379 PUBSUB channels 1) sakura原理 每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构 结构的 pubsub_channels 属性是一个字典 这个字典就用于保存订阅频道的信息其中字典的键为正在被订阅的频道 而字典的值则是一个链表 链表中保存了所有订阅这个频道的客户端。 客户端订阅就被链接到对应频道的链表的尾部退订则就是将客户端节点从链表中移除。 缺点 如果一个客户端订阅了频道但自己读取消息的速度却不够快的话那么不断积压的消息会使redis输出缓冲区的体积变得越来越大这可能使得redis本身的速度变慢甚至直接崩溃。这和数据传输可靠性有关如果在订阅方断线那么他将会丢失所有在短线期间发布者发布的消息。 应用 消息订阅公众号订阅微博关注等等其实更多是使用消息队列来进行实现多人在线聊天室。 但是稍微复杂的场景我们就会使用消息中间件MQ处理。 Redis主从复制 概念 主从复制是指将一台Redis服务器的数据复制到其他的Redis服务器。前者称为主节点Master/Leader,后者称为从节点Slave/Follower 数据的复制是单向的只能由主节点复制到从节点主节点以写为主、从节点以读为主。 默认情况下每台Redis服务器都是主节点一个主节点可以有0个或者多个从节点但每个从节点只能由一个主节点。 作用 数据冗余主从复制实现了数据的热备份是持久化之外的一种数据冗余的方式。故障恢复当主节点故障时从节点可以暂时替代主节点提供服务是一种服务冗余的方式负载均衡在主从复制的基础上配合读写分离由主节点进行写操作从节点进行读操作分担服务器的负载尤其是在多读少写的场景下通过多个从节点分担负载提高并发量。高可用基石主从复制还是哨兵和集群能够实施的基础。 为什么使用集群 单台服务器难以负载大量的请求单台服务器故障率高系统崩坏概率大单台服务器内存容量有限。 环境配置 查看当前库的信息info replication 既然需要启动多个服务就需要多个配置文件。每个配置文件对应修改以下信息 端口号pid文件名日志文件名rdb文件名 启动单机多服务集群 一主二从配置 默认情况下每台Redis服务器都是主节点我们一般情况下只用配置从机就好了 认老大一主79二从8081 使用 SLAVEOF xxx.xxx.xxx.xxx(主机号) 6379(端口号) 就可以为从机配置主机了。 然后主机上也能看到从机的状态 我们这里是使用命令搭建是暂时的真实开发中应该在从机的配置文件中进行配置这样的话是永久的。 使用规则 从机只能读不能写主机可读可写但是多用于写。当主机断电宕机后默认情况下从机的角色不会发生变化 集群中只是失去了写操作当主机恢复以后又会连接上从机恢复原状。当从机断电宕机后若不是使用配置文件配置的从机再次启动后作为主机是无法获取之前主机的数据的若此时重新配置称为从机又可以获取到主机的所有数据。这里就要提到一个同步原理(从机会复制其他从机数据第二条中提到默认情况下主机故障后不会出现新的主机有两种方式可以产生新的主机从机手动执行命令slaveof no one,这样执行以后从机会独立出来成为一个主机使用哨兵模式自动选举 如果主机断开了连接我们可以使用SLAVEOF no one让自己变成主机其他的节点就可以手动连接到最新的主节点手动如果这个时候老大修复了那么久重新连接 哨兵模式 主从切换技术的方法是当主服务器宕机后需要手动把一台从服务器切换为主服务器这就需要人工干预费事费力还会造成一段时间内服务不可用。 所有我们推荐使用哨兵模式 哨兵的作用 通过发送命令让Redis服务器返回监控其运行状态包括主服务器和从服务器。当哨兵监测到master宕机会自动将slave切换成master然后通过发布订阅模式通知其他的从服务器修改配置文件让它们切换主机。 哨兵的核心配置 sentinel monitor mymaster 127.0.0.1 6379 1 数字1表示 当一个哨兵主观认为主机断开就可以客观认为主机故障然后开始选举新的主机 当从机代替主机之后之前被替换掉的主机重新加入不能再继续当主机了 哨兵模式优缺点 哨兵集群基于主从复制模式所有主从复制的优点它都有主从可以切换故障可以转移系统的可用性更好哨兵模式是主从模式的升级手动到自动更加健壮 缺点 Redis不好在线扩容集群容量一旦达到上限在线扩容就十分麻烦实现哨兵模式的配置其实是很麻烦的里面有很多配置项 缓存穿透与雪崩 缓存穿透 概念 在默认情况下用户请求数据时会先在缓存(Redis)中查找若没找到即缓存未命中再在数据库中进行查找数量少可能问题不大可是一旦大量的请求数据例如秒杀场景缓存都没有命中的话就会全部转移到数据库上造成数据库极大的压力就有可能导致数据库崩溃。网络安全中也有人恶意使用这种手段进行攻击被称为洪水攻击。 解决方案 布隆过滤器 对所有可能查询的参数以Hash的形式存储以便快速确定是否存在这个值在控制层先进行拦截校验校验不通过直接打回减轻了存储系统的压力。 缓存空对象 一次请求若在缓存和数据库中都没找到就在缓存中方一个空对象用于处理后续这个请求。 这样做有一个缺陷存储空对象也需要空间大量的空对象会耗费一定的空间存储效率并不高。解决这个缺陷的方式就是设置较短过期时间 即使对空值设置了过期时间还是会存在缓存层和存储层的数据会有一段时间窗口的不一致这对于需要保持一致性的业务会有影响。 缓存击穿量太大缓存过期 概念 相较于缓存穿透缓存击穿的目的性更强一个存在的key在缓存过期的一刻同时有大量的请求这些请求都会击穿到DB造成瞬时DB请求量大、压力骤增。这就是缓存被击穿只是针对其中某个key的缓存不可用而导致击穿但是其他的key依然可以使用缓存响应。 比如热搜排行上一个热点新闻被同时大量访问就可能导致缓存击穿。 解决方案 1、设置热点数据永不过期 这样就不会出现热点数据过期的情况但是当Redis内存空间满的时候也会清理部分数据而且此种方案会占用空间一旦热点数据多了起来就会占用部分空间。 2、加互斥锁(分布式锁) 在访问key之前采用SETNXset if not exists来设置另一个短期key来锁住当前key的访问访问结束再删除该短期key。保证同时刻只有一个线程访问。这样对锁的要求就十分高。 缓存雪崩 概念 大量的key设置了相同的过期时间导致在缓存在同一时刻全部失效造成瞬时DB请求量大、压力骤增引起雪崩。 解决方案 redis高可用 这个思想的含义是既然redis有可能挂掉那我多增设几台redis这样一台挂掉之后其他的还可以继续工作其实就是搭建的集群 限流降级 这个解决方案的思想是在缓存失效后通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存其他线程等待。 数据预热 数据加热的含义就是在正式部署之前我先把可能的数据先预先访问一遍这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key设置不同的过期时间让缓存失效的时间点尽量均匀。
http://www.zqtcl.cn/news/89978/

相关文章:

  • 大型网站技术架构wordpress 换域名
  • 网站建设 首选百川互动织梦网站数据下载
  • pc端网站开发技术网站建设与维护工作内容
  • 凡科怎么建设网站可以做动画的网站
  • 企业网站整合网页界面设计案例赏析
  • 精美网站郑州企业培训
  • 网站备案是一年一次吗百度风云榜小说榜排名
  • 优化网站标题是什么意思wordpress主分类
  • 公司网站开发费计入办公费个人外贸网站建设
  • 阿里云主机可以放几个网站网站建设企划
  • 做玻璃钢的企业网站网站图片要多少像素
  • 药厂网站建设页网站
  • 为了做宣传网站而注册公司网站图片上怎么做弹幕效果
  • 音乐网站整站程序帝国cms做视频网站
  • 光明新区住房和建设局网站91关键词
  • 专业自动化网站建设计算机网络技术就业公司
  • 模板wordpress演示站怎么做海口seo网站推广
  • 平凉公司网站建设高端品牌男装
  • 性价比高的seo网站优化为什么装修公司建议半包
  • 手机网站左右滑动效果网站模板之家
  • 哈尔滨的建设信息网站微网站的好处
  • 网站收费怎么做四川网站推广优化
  • 移动网站尺寸页面升级3秒后自动跳转
  • 网站建设费用高低有什么区别专业建设的基本要素
  • 手机端网站 优帮云外贸网站如何建站
  • 免费微信建站有哪些网站保定专业做网站公司
  • 石家庄做网站的公司有哪些宝塔linux面板官网
  • 成都网站建设138ui设计素材
  • 郑州网站建设公司 艾特广州建筑公司排名
  • excel做网站链接现在的网站开发方式