redis学习整理

news2025/1/9 1:37:22

目录

一、简述

二、作用

三、五大基本数据类型

Key命令

1.String字符串

2.List列表

3.Set(集合)

4.Hash(哈希)

5.zSet(有序集合)

四、主从复制 与 哨兵模式

   1. 主从复制:

 2.   哨兵模式:

   3. 集群模式:

五、缓存


一、简述

Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

二、作用

1、内存存储、持久化,内存中是断电即失

2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量!例如:京东淘宝购物车)
6、…

三、五大基本数据类型

Key命令

> ping  #查看当前连接是否正常,正常返回PONG
PONG
> clear  #清楚当前控制台(为了更好的看到下面输入的命令)
> keys *  #查看当前库里所有的key
1) "db"
> FLUSHALL  #清空所有库的内容
OK

1.String字符串

# 添加、查询、追加、获取长度,判断是否存在
> set name dingdada  #插入一个key为‘name’值为‘dingdada’的数据
OK
127.0.0.1:6379> get name  #获取key为‘name’的数据
"dingdada"
127.0.0.1:6379> get key1
"hello world!"
127.0.0.1:6379> EXISTS name  #判断key为‘name’的数据存在不存在,存在返回1
(integer) 1
127.0.0.1:6379> EXISTS name1  #不存在返回0
(integer) 0
127.0.0.1:6379> APPEND name1 dingdada1  #追加到key为‘name’的数据后拼接值为‘dingdada1’,如果key存在类似于java中字符串‘+’,不存在则新增一个,类似于Redis中的set name1 dingdada1 ,并且返回该数据的总长度
(integer) 9
127.0.0.1:6379> STRLEN name1  #查看key为‘name1’的字符串长度
(integer) 9
127.0.0.1:6379> set key1 "hello world!"  #注意点:插入的数据中如果有空格的数据,请用“”双引号,否则会报错!
OK
127.0.0.1:6379> set key1 hello world!  #报错,因为在Redis中空格就是分隔符,相当于该参数已结束
(error) ERR syntax error
127.0.0.1:6379> set key1 hello,world!  #逗号是可以的
OK

#自增、自减
> set num 0  #插入一个初始值为0的数据
OK
> get num
"0"
> incr num  #指定key为‘num’的数据自增1,返回结果  相当于java中 i++
(integer) 1
> get num  #一般用来做文章浏览量、点赞数、收藏数等功能
"1"
> decr num  #指定key为‘num’的数据自减1,返回结果  相当于java中 i--
(integer) 0
> decr num  #可以一直减为负数~
(integer) -1
> decr num  #一般用来做文章取消点赞、取消收藏等功能
(integer) -2
> INCRBY num 10  #后面跟上by  指定key为‘num’的数据自增‘参数(10)’,返回结果
(integer) 7
> INCRBY num 10
(integer) 17
> DECRBY num 3  #后面跟上by  指定key为‘num’的数据自减‘参数(3)’,返回结果
(integer) 14


#截取、替换
> set key1 "hello world!"
OK
> GETRANGE key1 0 4  #截取字符串,相当于java中的subString,下标从0开始,不会改变原有数据
"hello"
> GETRANGE key1 0 -1  #0至-1相当于 get key1,效果一致,获取整条数据
"hello world!"
> set key2 "hello,,,world!"
OK
> get key2
"hello,,,world!"
> SETRANGE key2 5 888  #此语句跟java中replace有点类似,下标也是从0开始,但是有区别:java中是指定替换字符,Redis中是从指定位置开始替换,替换的数据根据你所需替换的长度一致,返回值是替换后的长度
(integer) 14
> get key2
"hello888world!"

#设置过期时间、不存在设置
#设置过期时间,跟Expire的区别是前者设置已存在的key的过期时间,而setex是在创建的时候设置过期时间
> setex name1 15  dingdada  #新建一个key为‘name1’,值为‘dingdada’,过期时间为15秒的字符串数据
OK
> ttl name1  #查看key为‘name1’的key的过期时间
(integer) 6
> ttl name1  #返回为-2时证明该key已过期,即不存在
(integer) -2
> setnx name2 dingdada2  #如果key为‘name2’不存在,新增数据,返回值1证明成功
(integer) 1
> get name2
"dingdada2"
> keys *
1) "name2"
> setnx name2 "dingdada3"  #如果key为‘name2’的已存在,设置失败,返回值0,也就是说这个跟set的区别是:set会替换原有的值,而setnx不会,存在即不设置,确保了数据误操作~
(integer) 0
> get name2
"dingdada2"

#mset、mget
> mset k1 v1 k2 v2 k3 v3  #插入多条数据
OK
> keys *  #查询所有数据
1) "k2"
2) "k3"
3) "k1"
> mget k1 k2 k3  #查询key为‘k1’,‘k2’,‘k3’的数据
1) "v1"
2) "v2"
3) "v3"
> MSETNX k1 v1 k4 v4  #msetnx是一个原子性的操作,在一定程度上保证了事务!要么都成功,要么都失败!相当于if中的条件&&(与)
(integer) 0
> keys *
1) "k2"
2) "k3"
3) "k1"
> MSETNX k5 v5 k4 v4  #全部成功
(integer) 1
> keys *
1) "k2"
2) "k4"
3) "k3"
4) "k5"
5) "k1"

# getset
> getset name1 dingdada1  #先get再set,先获取key,如果没有,set值进去,返回的是get的值
(nil)
> get name1
"dingdada1"
> getset name1 dingdada2  ##先获取key,如果有,set(替换)最新的值进去,返回的是get的值
"dingdada1"
> get name1  #替换成功
"dingdada2"

2.List列表

# lpush(左插入)、lrange(查询集合)、rpush(右插入)
> lpush list v1  #新增一个集合
(integer) 1
> LRANGE list 0 -1  #查询list的所有元素值
1) "v3"
2) "v2"
3) "v1"
> lpush list1 v1 v2 v3 v4 v5  #批量添加集合元素
(integer) 5
> LRANGE list1 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
###这里大家有没有注意到,先进去的会到后面,也就是我们的lpush的意思是左插入,l--left
#rpush
> LRANGE list 0 1  #指定查询列表中的元素,从下标零开始,1结束,两个元素
1) "v3"
2) "v2"
> LRANGE list 0 0  #指定查询列表中的唯一元素
1) "v3"
> rpush list rv0  #右插入,跟lpush相反,这里添加进去元素是在尾部!
(integer) 4
##联想:这里我们是不是可以做一个,保存的记录值(如:账号密码的记录),
每次都使用lpush,老的数据永远在后面,我们每次获取 0 0 位置的元素,是不是相当于更新了
数据操作,但是数据记录还在?想要查询记录即可获取集合所有元素!

#lpop(左移除)、rpop(右移除)
> lpop list  #从头部开始移除第一个元素
"v5"
#rpop
> rpop list
"v1"
127.0.0.1:6379> LRANGE list 0 -1  #从尾部开始移除第一个元素
1) "v4"
2) "v3"
3) "v2"

# lindex(查询指定下标元素)、llen(获取集合长度)
> lindex list 1  #获取指定下标位置集合的元素,下标从0开始计数
"v3"
> llen list  #获取指定集合的元素长度,相当于java中的length或者size
(integer) 3

#lrem(根据value移除指定的值)
> lrem list 1 v2  #移除集合list中的元素是v2的元素1个
(integer) 1
> lrem list 0 v3 #移除集合list中的元素是v2的元素1个,这里的0和1效果是一致的
(integer) 1
> lrem list 3 v2  #移除集合list中元素为v2 的‘3’个,这里的参数数量,如果实际中集合元素数量不达标,不会报错,全部移除后返回成功移除后的数量值
(integer) 3

#ltrim(截取元素)、rpoplpush(移除指定集合中最后一个元素到一个新的集合中)
> ltrim list 1 2  #通过下标截取指定的长度,这个list已经被改变了,只剩下我们所指定截取后的元素
OK
> rpoplpush list newlist  #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值
"v1"

#lset(更新)、linsert
> lset list 1 newV5  #更新list集合中下标为‘1’的元素为‘newV5’
OK
##注意点:
> lset list1 0 vvvv  #如果指定的‘集合’不存在,报错
(error) ERR no such key
> lset list 8 vvv  #如果集合存在,但是指定的‘下标’不存在,报错
(error) ERR index out of range
> LINSERT list after v3 insertv3  #在集合中的‘v3’元素 ‘(after)之后’ 加上一个元素
(integer) 5
> LINSERT list before v3 insertv3  #在集合中的‘v3’元素 ‘(before)之前’ 加上一个元素
(integer) 6

3.Set(集合)

#sadd(添加)、smembers(查看所有元素)、sismember(判断是否存在)、scard(查看长度)、srem(移除指定元素)
#set中所有的元素都是唯一的不重复的!
> sadd set1 ding da mian tiao  #添加set集合(可批量可单个,写法一致,不再赘述)
(integer) 4
> SMEMBERS set1  #查看set中所有元素
1) "mian"
2) "da"
3) "tiao"
4) "ding"
> SISMEMBER set1 da  #判断某个值在不在set中,在返回1
(integer) 1
> SISMEMBER set1 da1  #不在返回0
(integer) 0
> SCARD set1  #查看集合的长度,相当于size、length
(integer) 4
> srem set1 da  #移除set中指定的元素
(integer) 1
> SMEMBERS set1  #移除成功
1) "mian"
2) "tiao"
3) "ding"

#srandmember(抽随机)
127.0.0.1:6379> SRANDMEMBER myset 1  #随机抽取myset中1个元素返回
1) "4"
127.0.0.1:6379> SRANDMEMBER myset  #不填后参数,默认抽1个值,但是下面返回不会带序号值
"3"
127.0.0.1:6379> SRANDMEMBER myset 3  #随机抽取myset中3个元素返回
1) "1"
2) "2"
3) "3"

#spop(随机删除元素)、smove(移动指定元素到新的集合中)
> spop myset  #随机删除1个元素,不指定参数值即删除1个
"2"
127.0.0.1:6379> spop myset 2  #随机删除2个元素
1) "3"
2) "5"
127.0.0.1:6379> SMEMBERS myset  #查询删除后的结果
1) "1"
2) "4"
3) "6"
> smove myset myset2 1  #移动指定set中的指定元素到新的set中
(integer) 1
> SMEMBERS myset  #查询原来的set集合
1) "4"
2) "6"
9> SMEMBERS myset2  #查询新的set集合,如果新的set存在,即往后加,如果不存在,则自动创建set并且加入进去
1) "1"

#sdiff(差集)、sinter(交集)、sunion(并集)
> sadd myset1 1 2 3 4 5
(integer) 5
> sadd myset2 3 4 5 6 7
(integer) 5
> SMEMBERS myset1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
> SMEMBERS myset2
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
> SDIFF myset1 myset2  #查询指定的set之间的差集,可以是多个set
1) "1"
2) "2"
> SINTER myset1 myset2  #查询指定的set之间的交集,可以是多个set
1) "3"
2) "4"
3) "5"
> sunion myset1 myset2  #查询指定的set之间的并集,可以是多个set
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"


#可实现共同好友、共同关注等需求

4.Hash(哈希)

#hset(添加hash)、hget(查询)、hgetall(查询所有)、hdel(删除hash中指定的值)、hlen(获取hash的长度)、hexists(判断key是否存在)
> hset myhash name dingdada age 23  #添加hash,可多个
(integer) 2
> hget myhash name  #获取hash中key是name的值
"dingdada"
> hget myhash age  #获取hash中key是age的值
"23"
> hgetall myhash  #获取hash中所有的值,包含key
1) "name"
2) "dingdada"
3) "age"
4) "23"
> hset myhash del test  #添加
(integer) 1
> hgetall myhash
1) "name"
2) "dingdada"
3) "age"
4) "23"
5) "del"
6) "test"
> hdel myhash del age  #删除指定hash中的key(可多个),key删除后对应的value也会被删除
(integer) 2
> hgetall myhash
1) "name"
2) "dingdada"
> hlen myhash  #获取指定hash的长度,相当于length、size
(integer) 1
> HEXISTS myhash name  #判断key是否存在于指定的hash,存在返回1
(integer) 1
> HEXISTS myhash age  #判断key是否存在于指定的hash,不存在返回0
(integer) 0

#hkeys(获取所有key)、hvals(获取所有value)、hincrby(给值加增量)、hsetnx(存在不添加)
> hset myhash age 23 high 173
(integer) 2
> hgetall myhash
1) "name"
2) "dingdada"
3) "age"
4) "23"
5) "high"
6) "173"
> hkeys myhash  #获取指定hash中的所有key
1) "name"
2) "age"
3) "high"
> hvals myhash   #获取指定hash中的所有value
1) "dingdada"
2) "23"
3) "173"
> hincrby myhash age 2  #让hash中age的value指定+2(自增)
(integer) 25
> hincrby myhash age -1  #让hash中age的value指定-1(自减)
(integer) 24
> hsetnx myhash nokey novalue  #添加不存在就新增返回新增成功的数量(只能单个增加哦)
(integer) 1 
> hsetnx myhash name miaotiao  #添加存在则失败返回0
(integer) 0
> hgetall myhash
1) "name"
2) "dingdada"
3) "age"
4) "24"
5) "high"
6) "173"
7) "nokey"
8) "novalue"

5.zSet(有序集合)

#zadd(添加)、zrange(查询)、zrangebyscore(排序小-大)、zrevrange(排序大-小)、zrangebyscore withscores(查询所有值包含key)
> zadd myzset 1 one 2 two 3 three  #添加zset值,可多个
(integer) 3
> ZRANGE myzset 0 -1  #查询所有的值
1) "one"
2) "two"
3) "three"
#-inf 负无穷  +inf 正无穷
> ZRANGEBYSCORE myzset -inf +inf  #将zset的值根据key来从小到大排序并输出
1) "one"
2) "two"
3) "three"
> ZRANGEBYSCORE myzset 0 1  #只查询key<=1的值并且排序从小到大
1) "one"
> ZREVRANGE myzset 1 -1  #从大到小排序输出
1) "two"
2) "one"
> ZRANGEBYSCORE myzset -inf +inf withscores  #查询指定zset的所有值,包含序号的值
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

#zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)
> zadd myset 1 v1 2 v2 3 v3 4 v4
(integer) 4
> ZRANGE myset 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
> zrem myset v3  #移除指定的元素,可多个
(integer) 1
> ZRANGE myset 0 -1
1) "v1"
2) "v2"
3) "v4"
> zcard myset  #查看zset的元素个数,相当于长度,size。
(integer) 3
> zcount myset 0 100  #查询指定区间内的元素个数
(integer) 3
> zcount myset 0 2  #查询指定区间内的元素个数
(integer) 2

#成绩表排序,工资表排序,年龄排序等需求可以用zset来实现

四、主从复制 与 哨兵模式

Redis通过主从复制、哨兵模式和集群模式等方式实现高可用和横向扩展。

   1. 主从复制:

Redis 的主从复制是实现高可用的基础。主从复制的作用是将主节点的数据复制到从节点上,当主节点出现故障时,从节点可以接替主节点,继续提供服务。

在 Redis 中,主节点负责写操作,从节点只负责读操作。当主节点出现故障时,从节点会自动升级为主节点,继续提供写操作。

主从复制的实现有两种方式:异步复制和半同步复制。异步复制的实现简单,但可能会出现数据丢失的情况。半同步复制的实现复杂,但可以保证数据不丢失。

 2.   哨兵模式:

哨兵模式是 Redis 提供的一种高可用性解决方案。哨兵的作用是监控 Redis 的主从节点是否正常工作,当发现节点出现故障时,自动将从节点晋升为主节点,继续提供服务。

哨兵通常运行在独立的服务器上,与 Redis 实例分开部署,以防单点故障。

哨兵可以同时监控多个 Redis 实例,并且可以自动进行故障转移,保证服务的可用性。

   3. 集群模式:

Redis通过集群模式实现数据的分片和负载均衡。集群模式可以将数据分布到多个节点上,每个节点负责存储部分数据。当需要读取数据时,客户端可以根据key的hash值定位到对应的节点进行读取,实现负载均衡和横向扩展。


五、缓存

Redis作为一种内存数据库,具有快速的数据访问和高效的数据存储,适合用作缓存的存储层。Redis可以缓存数据的计算结果、页面内容、数据库查询结果等,通过提高数据访问速度和响应速度,提升系统性能和用户体验。

 参考链接:

Redis简述|以及它能用于做什么?_猿某人、的博客-CSDN博客Redis(一)入门:五大数据类型的学习和理解②_redis的数据类型?对spring和springmvc的理解?_大鱼等于负的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【正点原子STM32连载】 第四十一章 游戏手柄实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言&#xff1a; 委托构造函数&#xff1a; 类内初始化&#xff1a; 空指针&#xff1a; 枚举类&#xff1a; 总结&#xff1a; 前言&#xff1a; C的学习难度大&#xff0c;内容繁多。因此我们要及时掌握C的各种特性&#xff0c;因此我们更新本篇文章&#xff0c;向…

部署vue element-ui admin报错(vue2)

部署vue element-ui admin报错(vue2) 目录 部署vue element-ui admin报错(vue2) 一、官方安装说明 二、部署报错的关键影响因素 2.1、“开发模板”版本 2.2、完整版 2.2.1、基础知识和基础依赖 2.2.2、原理-安装过程 三、完整版 3.3、win10环境 四、效果 4.1、win7…

云安全技术——kvm虚拟化技术

目录 10-1 kvm简介 10-2 在CentOS 7 图形化界面下安装KVM 使用IDEA开发读写MySQL数据库程序 实验目的 了解 CentOS7图形化界面的部署方法 了解 KVM的组成和作用 了解 KVM的技术架构 了解KVM的安装方法 了解 KVM创建虚拟机的方法 了解KVM的常用管理命令 实验要求 能部署图形化…

为什么建议孩子学Python?理由都在这!

近几年&#xff0c;越来越多的家长选择让孩子学习编程&#xff0c;以此提高孩子的逻辑思维、信息素养等综合能力。 Python作为一种计算机程序设计语言&#xff0c;在科技行业中有广泛的应用&#xff0c;逐渐成为少儿编程教育中必学课程之一。今天&#xff0c;编编就为大家详细…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了HTML / JSP编辑器、智能代码完成和内容辅助等功能&#xff0c;本文将继续介绍Emmet支持、Outline 视图功能等。 MyEclipse v2023.1正式版下载 如果您有HTML或JSP文件要编辑&#xff0c;这里…

chatgpt赋能python:Python聊天程序:现代化交流的必备工具

Python聊天程序&#xff1a;现代化交流的必备工具 在信息技术快速发展的现代社会&#xff0c;聊天作为一种流行的交流方式已经取代了传统的语音电话和短信。由于智能手机和电脑的广泛普及&#xff0c;越来越多的人习惯于使用聊天软件来与朋友、家人和同事保持联系。因此&#…

GBASE南大通用携手麒麟软件、索信达 共推金融信创联合解决方案

在国家信创战略推动下&#xff0c;我国正逐步实现基础硬件-基础软件-行业应用软件的国产化替代。信创浪潮中&#xff0c;各产业链以及不同垂直细分领域的创新主体&#xff0c;正以开放、创新、团结的姿态&#xff0c;形成高凝聚力的生态合作&#xff0c;共推信创产业发展&#…

【Java】JVM学习(三)

JVM的整体内存结构 本地方法栈 本地方法栈跟 Java 虚拟机栈的功能类似&#xff0c;Java 虚拟机栈用于管理 Java 函数的调用&#xff0c;而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的&#xff0c;而是由 C 语言实现的(比如Object.hashcode方法)。 …

PCA(主成分分析)

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示&#xff0c;可用于提取数据的主要特征分量&#xff0c;常用于高维数据的降维。数据降维是无监督学习的另外一个常见问题。 数据的向量表示及降维问题 …

PostgreSQL 如何对索引进行分析和处理

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

智慧煤矿4G物联网方案,矿山矿井远程监控管理4G网关应用

随着经济发展煤矿需求不断激增&#xff0c;矿山矿井普遍处于偏远山区&#xff0c;生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题&#xff0c;利用网关对现场终端设备连接组网&#xff0c;实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛&#xff0c;户外环境…

《Opencv3编程入门》学习笔记—第八章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第八章 图像轮廓与图像分割修复 一、查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线&#xff0c;其表示方法可能根据不同的情况而有所不…

FFmpeg 播放器实现音视频同步的几种方式

我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染&#xff0c;本文将实现播放器的最后一个重要功能&#xff1a;音视频同步。 老人们经常说&#xff0c;播放器对音频和视频的播放没有绝对的静态的同步&#xff0c;只有相对的动态的同步&#…

深度学习管理工具

1. mlflow https://zhuanlan.zhihu.com/p/363673389 官方文档&#xff1a; https://www.mlflow.org/docs/latest/index.html https://zhuanlan.zhihu.com/p/67173051 在跟踪实验时&#xff0c;通过运行 mlflow ui 后在 http&#xff1a;// localhost&#xff1a;5000 中进行…

ranger,hive,hdfs的三者的权限管理

ranger&#xff0c;hive&#xff0c;hdfs的三者的权限管理 情况一&#xff1a;连接datagrip 用户在hdfs上的权限 可以看出只给了用户write权限&#xff0c;尝试登录xwq用户&#xff0c;在datagrip上登录成功 经过实验验证&#xff1a;要想使用datagrip或者hive-cli登录hive…

C++11【一】

文章目录 一、C11简介二、右值引用三、可变参数模板四、 empacle_back(移动构造/赋值)五、简单特性 一、C11简介 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了很多新特性&#xff0c;比如&#xff1a;类型推导(auto关键字)、Lambda表达式、线程库、列表初始化…

电源浪涌保护器加装后备保护器的作用

随着现代化技术的发展&#xff0c;信息化系统集成度越来越高。设备敏感度高&#xff0c;抗冲击能力低&#xff0c;极易受到电涌脉冲的危害。电涌保护器&#xff08;SPD&#xff09;作为专业的防电涌产品&#xff0c;应用越来越广&#xff0c;SPD的应用涉及很多的专业知识&#…

孩子创新思维秘籍

头脑风暴最重要的原则之一就七个字&#xff0c; 要数量&#xff0c;不要质量。 意思就是说&#xff0c;你尽可能的去胡思乱想&#xff0c;胡说八道&#xff0c;天马行空就对了。 我们从这一大堆古灵精怪的玩意儿里面去筛选那些真正有价值的东西&#xff0c;可以拓展的方案。 然…

【技术选型】Redis的几种集群方案、及优缺点对比

文章目录 背景一、主从模式二、哨兵模式三、Redis Cluster四、各大厂的Redis集群方案客户端分片代理分片Codis 五、Redis集群方案解决方案六、Redis集群方案原理总结 背景 在服务开发中&#xff0c;单机都会存在单点故障的问题&#xff0c;及服务部署在一台服务器上&#xff0…