企业网站模板建站怎么用,网站开发团队简介如何写,网站制作公司费用,godaddy 安装wordpress1.Redis的应用场景
Redis支持类型#xff1a;String、hash、set、zset、list
String类型 hash类型 set类型 zset类型 list类型 一般用作缓存#xff0c;例如 如何同时操作同一功能
2.redis是单线程
Redis服务端(数据操作)是单线程#xff0c;所以Redis是并发安全的,因…1.Redis的应用场景
Redis支持类型String、hash、set、zset、list
String类型 hash类型 set类型 zset类型 list类型 一般用作缓存例如 如何同时操作同一功能
2.redis是单线程
Redis服务端(数据操作)是单线程所以Redis是并发安全的,因为无论客户端有多少个请求线程在Redis执行命令时还是顺序执行
但是I/O线程(网络请求)在Redis6.0版本之前是和服务端共用一个线程Redis6.0版本之后就和Redis服务端不共用。 所以如果删除key或者新增key时若数据量很大会造成阻塞因为命令排队执行
3. redis底层结构
Redis由key-value形式存储在哈希字典dict中。
key通过hash算法转换为数字根据下标存储在数组中但是也会存在不同的key通过hash算法计算出相同下标此时会对相同下标进行链表存储若数组长度大于64且链表大于8则会转换为红黑树存储当红黑树长度为6时则会自动转换为链表式存储。【hashmap的底层】
dict由两个数组(ht[0]/ht[1])、重新哈希索引构成。而数组ht[0]则是由dictEntry链表、数组大小、数组已用大小构成。dictEntry由key、value、next(下一个指针)组成。 扩容rehash
每个数据库中都有一个dict存储key-value数据维护了两张hash表。正常使用0号表若需要扩容rehash时需要0号表和1号表共同使用。查询时先从0号表中找后判断是否在rehash若在rehash则从1号表找若不在则直接返回插入时若发生rehash时插入到1号表若未发生rehash时则插入到0号表。
key是字符串类型value可以是String、list、set、zset、hash。
字符串String type:String encoding:raw/embstr、int 对应的内部结构是sds、int sds:简单动态字符串和Java的StringBuffer类似可自动分配内存及释放内存 其他类型TODO
4.set命令使用时一般会对key设置过期时间
set命令若是没有对key设置过期时间一般默认永不过期所以一般redis用作缓存时读取到数据后会将数据清除或者对数据设置过期时间 5. redis过期策略
当redis所用内存超过maxmemory时会触发主动清理策略所以若未出现误操作redis没有过期但是数据还是被删除了原因可能是这个主动清理策略导致的可以看是否是这个原因 此时默认为0表示没有设置最大内存
针对设置过期时间的key volatile-ttl根据过期时间的先后顺序进行删除越早过期越先被删除volatile-random随机删除volatile-lru(least recently used)最近最少使用 volatile-lfu(least frequently used)最近不经常使用针对所有key allkeys-random随机删除allkeys-lru最近最少使用allkeys-lfu最近不经常用不处理 noeviction不会删除数据只是再次访问提示报错
一般都使用lru算法但热点数据会使用lfu算法
过期可以删除策略
惰性删除
key过期时是不会检查的只有再次访问到key时(get命令)才会检测是否已过期过期则会删除但是不是会访问全部key的所以存在大量过期key未被删除占用内存
定期删除
每隔一段时间检测key是否过期过期则删除可通过配置时间间隔(set命令的过期时间)来调整视项目情况而定
定时删除
通过集合及定时器来删除(zadd命令)对每个过期时间的key建一个定时器到过期时间则删除key所以耗CPU影响服务的响应时间
Redis将惰性删除和定期删除的结合使用
6.redis主从、哨兵、集群
主从
主节点(master)提供对外服务从节点(slave)主要是备份当master挂了运维人员会介入将其他slave中的一台作为master待之前挂掉的master恢复后以slave模式启动以当前master为主节点ABC三个节点开始A为masterBC为slave节点当A挂掉时将C作为主节点AB为从节点继续工作 哨兵
哨兵集群会随时监控master节点与slave节点的状态及情况当master节点挂掉时会自动判断哪台slave节点作为master节点并将其他节点改为以master节点为首的slave节点所以哨兵模式不需要运维介入自己执行但是时间就说不准可能几秒或十几秒的。当有客户端请求访问优先发给哨兵判断哪台为master节点得到结果后再去访问master节点。因为哨兵模式是自己执行所以时间不确定若此时有请求进来会造成瞬间访问断联的情况。每个节点的内存不宜过大因为持久化文件过大导致主从数据同步非常慢。 集群
集群主要解决高并发操作集群由多个分片构成的每个master存储不同的数据各master之间是互通的可以检测心跳当出现某一个分片的master挂掉该分片下面的某一个slave会调整为master节点其他节点会调整为slave节点。 redis集群数据hash分片
redis集群将数据分为16384个槽位每个节点占用一部分槽位槽位信息存储在每个节点
客户端发送请求后会先根据key计算出hash值后除以16384取余得到所在节点的位置
redis集群的节点超时限制
若由于网络信号问题出现检测不到其中master节点信息此时会自动判断并选举新的master节点。若出现网络频繁抖动则会频繁主从切换。此时可配置节点超时信息配置
redis.conf配置文件 cluster-node-timeout 15000
redis集群的master节点要大于3个
当集群中一个分片的master挂掉后该下面的slave节点选举是由其他分片的master节点参与的要大于集群的一半的master节点同意才可选举成功。