redis学习

redis 清除内存机制

1.惰性删除 调用key的时候检查是否过期,已过期删除并返回nil
2.定期删除
定期删除原理:随机抽样,删除的key大于抽样数量的1/4继续删 执行时间太长的话主动中断
3.最大内存检查 设置总内存最大限制,如果到限制后,触发主动淘汰机制
volatile-lru,volatile-ttl,volatile-random,从已设置过期时间中的key
allkeys-lru,allkeys-random,从全部key
lru最近最少使用 ttl即将过期的 random随机
no-enviction禁入大多写命令

位图运算

setbit key 索引 0|1					将位的某个位置改为0或1
bitcount key start end 				统计key所对应的值中有几个1	 start和end代表字节索引

应用场景,登录天数统计,签到天数统计,登录设1未登录为0

命令

1.string

set key value nx ex  			nx:不存在才设置  ex:expire过期时间(单位s)
strlen key 						获取key存储值的长度
getrange key start stop 		获取指定范围切片内容(包含起点和终点)
setrange key index value 		从索引值开始,用value替换原内容;返回最新长度
mset key1 value1 key2 value2 	批量添加
mget key1 key2 					批量获取
incrby key 步长					将key增加指定步长
decrby key 步长					将key减少指定步长
incr key						将key增加1
decr key 						将key减少1
expire key 秒					设置key过期时间
pexpire key 毫秒				设置key过期时间 毫秒

2.list

元素是字符串类型,两边快中间慢,最多2^32-1个元素,索引同python列表,元素可重复
lpush key value1 value2
rpush key value1 value2
rpoplpush src dst 				从src尾部弹出一个元素加入到dst的头部;返回被弹出的元素
linsert key after|before value newvalue	在指定位置前后插入一个元素;执行成功返回列表长度
lrange key start stop
llen key
lpop key
rpop key
blpop key timeout				列表头部阻塞弹出,列表为空时阻塞
brpop key timeout				列表尾部阻塞弹出,列表为空时阻塞
lrem key count value 			删除指定元素,count指定个数 大于0从左边,小于0从右边
ltrim key start stop 	 		保留置顶范围内的元素,其他删除
lset key index newvalue			更新list指定索引的值

3.hash

由field和关联的value组成的键值对,都是字符串类型,最多2^32-1个键值对
无法对key内的值设置过期时间,只能对key设置

hset key field value
hsetnx key field value 
hmset key field value field2 value2
hlen key
hexist key field
hget key field 
hmget key field field
hgetall key

应用场景:1用户维度数据统计,关注数,粉丝数,喜欢商品数,发帖数
		  2缓存

python 字典:
d={}长度为8的数组
d['a'] = 'cs' -> hash('a')计算出位置  产生哈希冲突采用开放地址法(偏移量)
使用超过三分之二,扩容->rehash
删除key时,采用伪删除,方便查找时还原路径,保持查找探测链

redis hash:
哈希冲突->单链法(开放新的链表结构存储)
扩容->used/len  大于五扩容  大于1可能扩
扩容方式->第一个大于used*2的2的n次方
rehash方式->渐进式,逐步迁移,分散在调用数据时迁移到新表

4.set

无序,去重,元素是字符串类型,最多2^32-1个元素,与python集合一样
sadd key member1 member2
smembers key
srem key member1 member2
sismember key member 
srandmember key count				随机抽取成员
spop key count						随机弹出成员
scard key 							计算集合中元素个数
smove source destination member 	把元素从原集合移动到目标集合
sdiff key1 key2 					差集 key1 
sdiffstore destination key1 key2 	差集保存至另一个集合中
sinter key1 key2 					交集
sinterstore destination	key1 key2	
sunion key1 key2 					并集
sunionstore destination	key1 key2	

应用场景:共同好友(交集),抽奖(srandmember),防止元素重复,黑白名单,考试随机生成题目

5.zset

有序,去重,元素是字符串类型,每个元素都有一个浮点型的分值,按照分值从小到大排序
zadd key sorce member					先给分再给元素
zrange key start stop [withscores] 		升序
zrevrange key start stop [withscores]	降序
zscore key member
zrank
zrevrank
zrangebyscore key min max [withscores][limit offset count]
zrem key member
zincrby key increment member
zremrangebyscore key min max 			删除指定区间的元素
zcard key 
zcount key min max
zunionstore destination numkeys key[weights 权重值][AGGREGATE SUM|MIN|MAX] 并集
zinterstore destination numkeys key[weights 权重值][AGGREGATE SUM|MIN|MAX] 交集
应用场景:员工薪水

事务acid

	原子性:要么全部成功要么全部失败
	一致性:执行前后都要数据完整性都要一致(redis事务的目标)
	隔离性:事务和事务之间互不打扰
	持久性:事务一旦提交,对数据库的改变应该是永久的
	
redis是弱事务型数据库,并不具备全部ACID
	具备隔离性,不保证原子性和一致性,持久性也是redis的弱项
	命令:
		multi 开启事务  开启事务之后,redis开放一个存储空间存放命令
		执行redis命令
		exec执行事务
		discard取消事务
	特殊情况:
		1语法错误,自动执行discard,事务失效
		2语法无错误,但是类型操作错误,除执行错误语句其他全部成功执行
	
pipeline 流水线,结合redis思想开发的客户端技术
	打包命令,一次发送
	降低了客户端和服务端之间的网络通信
	创建连接池redis.ConnectionPool,创建pipeline 输入命令 执行execute返回所有执行结果
	python-> with r.pipeline(transaction=True) as pipe: pipe.multi() pipe.命令 pipe.execute

乐观锁watch
	监听一个key,再开启一个事务,若被监听的key在这个事务执行前和过程中被修改,则该次事务执行失败

数据持久化RDB与AOF

	将数据从掉电易失的内存中放到永久存储的设备上
	redis提供两种方式,RDB默认开启
	RDB:
	1.保存真实数据
	2.将服务器包含的所有数据库数据以二进制文件保存到硬盘中
	3.默认路径,/var/lib/redis/dump.rdb
		文件名和目录可在配置文件中修改,/etc/redis/redis.conf
		dir /var/lib/redis rdb的存放路径
		dbfilename dump.rdb 文件名
	4.触发RDB- 	SAVE或GBSAVE命令
				SAVE命令执行过程中,redis服务器将会阻塞,无法处理客户端的命令,直到save命令执行完毕
				如果RDB文件存在,那么将会用新的替代旧的
				BGSAVE->多线程 fork()子进程进行RDBsave
				正常关闭redis服务的时候,会触发RDB
	5.从配置文件中触发rdb持久化
		save 900 1
		save 300 10
			表示如果距离上一次rdb文件创建已经过去300秒,并且服务器的所有修改次数不少于10次
		save 60 10000
		只要三个条件任意一个被满足,服务器就自动执行bgsave
		每次创建RDB文件后,计数器就会清零重新计数
	说明:
		创建RDB文件需要将所有服务器的数据库资源都保存起来,这是一个非常消耗资源和时间的操作,
		并且创建RDB文件不能过于频繁,否则影响服务器的性能。
		每次RDB持久化总有时间间隔,间隔期间可能会丢失数据
	
	AOF:
	1.存储命令,而不是真实数据
	2.默认不开启
		开启方式(修改配置文件)
		1./etc/redis/redis.conf
		appendonly yes
		appendfilename "appendonly.aof"
		2.重启服务
		sudo /etc/init.d/redis-server restart
	3.执行原理
		1.每当修改数据的命令被执行时
		2.AOF文件中存储了执行过的命令,当服务器重启时,服务器只要重新执行一遍AOF文件中的命令,就能还原redis
		3.用户可以根据需要对AOF持久化进行修改,让redis遭遇意外时不丢失任何数据,或只丢失一秒钟的数据
	4.特殊说明
		1.系统在写入命令时,不用直接将内容写入硬盘中,而是将内存放入一个内存缓冲区buffer中,等到缓冲区被存满
		再将内容全部写入到硬盘中
		2.由于上述原因,当AOF持久化遭遇停机丢失命令的数量取决于写磁盘的时间,越早将命令写入磁盘丢失的数据就越少
	5.相关配置
		/etc/redis/redis.conf
		always
			服务器每写一条命令就将命令写入到硬盘里
		everysec
			每一秒写入磁盘
		no
			不主动写入磁盘,由操作系统决定何时写入磁盘
	6.AOF重写
		AOF文件要大于RDB,产生很多冗余命令
		为了让AOF文件控制在合理范围,避免胡乱增长,redis提供AOF重写功能,通过这个功能,服务器可以产生一个新的AOF文件
		新的AOF文件记录的数据库数据和原来的AOF文件记录的数据库数据完全一样
		新的AOF文件会使用尽量少的命令来记录数据库数据,因此新的AOF文件通常会小很多、
		AOF重写期间,服务器不会被阻塞,可以正常给客户端发送的命令请求
		
		触发AOF重写
			1.客户端向服务端发送GBREWRITEAOF
			2.通过修改配置文件让服务器自动触发BGREWRITEAOF命令
				auto-aof-rewrite-percentage 100
				auto-aof-rewrite-min-size 64mb
				1.只有当AOF文件增量大于100%时才进行重写,也就是大于一倍的时候触发
					第一次重写新增64M
					第二次重写新增128M
					第三次重写新增256M

主从复制:

	redis高可用方案,主从复制+哨兵
		1.一个Redis服务可以有多个该服务的复制品,master+slaves
		2.主从数据同步
		3.只有master能写,slaves只能读
		作用:分担了高并发情况下读命令的压力,提高可用性
		原理:从服务器执行执行客户端发送的读命令,客户端可以连接slaves执行读请求,降低master压力
	主从搭建-在多台机器上运行
		redis-server --port --slaveof ip port masterauth
		>slaveof IP PORT 使服务器成为谁的从服务器
		>slaveof no one  自封为王
		使用配置文件:
			每个redis服务器有个健全的配置文件.conf

哨兵:sentinel

	1.Sentinel不断检查Master和Slaves的状态
	2.每一个Sentinel可以监听任意多个Master和该Master下的Slaves
	当确定master阵亡后,自动将切换工作完成
	redis-sentinel .conf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值