Redis学习笔记

Redis6:

NoSQL(Not Only SQL),非关系型的数据库
不依赖业务逻辑方法存储,简单的key-value模式存储,因此大大的增加了数据库的扩展能力
*不遵循SQL标准
*不支持ACID
*远超SQL的性能
NoSQL适用场景:
*对数据高并发的读写
*海量数据的读写
*对数据高可扩展性的

Redis:一个开源的key-value存储系统

存储的value类型相对很多,包括string、list、set、zset(有序集合)、hash
*操作都是原子性的
redis:单线程+多路IO复用
key键操作:
	keys * 查看当前库所有key
	exists key 是否存在key
	type key 查看key类型
	del key 删除key    unlink key 异步删除
	expire key 秒钟 设置key过期时间
		ttl key 查看还有多少秒过期,-1表示永不过期 -2表示已过期
	select 切换数据库
	dbsize 查看当前数据库key的数量
	flushdb 清空当前库   flushall 通杀全部库
常用数据类型:
	String字符串:
		set <key><value> 添加键值对
		get <key>查询对应键指
		append <key><value>将给定的<value>追加到原值的末尾
		strlen <key>获得指的长度
		setnx <key><value>在key不存在,设置key的值
		incr <key> 值+1   decr <key> 值-1
		incrby <key>、decrby <key> 步长
		mset、mget、msetnx
		getrange <key> 起始位置 结束位置
		setrange <key> 起始位置 <value> 
		setex <key> 过期时间 <value> 
		getset <key><value> 设置新值的同时获得旧值
	List列表:单键多值
		lpush/rpush <key><value1><value2>...
		lpop/rpop <key>
		rpoplpush <key1><key2> 从k1取出,插到k2
		lrange <key> start stop
		linsert <key> before/after <value> newvalue
		lrem <key> n <value> 删除n个value
		lset <key> index <value> 下标为index的值替换成value
	Set集合:
		sadd <key><value1><value2>...
		smembers <key> 取出该集合所有值
		sismembers <key><value> 判断集合<key>中是否含有该值,有1没有0
		scard <key>返回该集合元素个数
		srem <key><value1><value2>... 删除集合中某个元素
		spop <key>随机从集合中吐出一个值
		srandmember<key> n 随机取出n个值
		smove <source><destination> value 将一个集合中的值放到另一个集合
		sinter <key1><key2>返回两个集合的交集元素
		sunion <key1><key2>返回两个集合的并集元素
		sdiff <key1><key2>返回两个集合的差集元素 key1中的,不包含key2中的
	Hash哈希:
		hset <key><field><value> 给key集合中的field键赋值value
		hget <key><field> 取出
		hmset <key><field1><value1><field2><value2> 批量设置hash的值
		hexists <key><field>查看key中,是否存在field
		hkeys <key> 列出该hash集合的所有field
		hvals <key> 列出该hash集合的所有value
		hincrby <key><field><increment>
		hsetnx <key><field><value> field不存在,设置为value
	Zset有序集合:
		zadd <key><score1><value1><score2><value2>... 加入有序集
		zrange <key> start stop [WITHSCORES] 返回有序集key中,下标在start stop之间的元素
			带有WITHSCORES,可以让分数一起和值返回到结果集
		zrangebyscore key minmax [WITHSCORES]
		zrevrangebyscore key maxmin [WITHSCORES]
		zincrby key increment value 加增量
		zrem key value 删除集合下指定值的元素
		zcount key min max 统计集合,分数区间内元素个数
		zrank key value 返回该值在集合中排名
		数据结构:Hash+跳跃表
新数据类型:
	Bitmaps:
		setbit <key><offset><value>
		getbit <key><offset>
		bitcount <key> start end 
		bitop 
	HyperLogLog:解决基数问题,去重
		pfadd <key><element>[element...]
		pfcount <key> 
		pfmerge newkey key1 key2 合并
	Geospatial:
		geoadd <key> 经度longitude 纬度latitude member
		geopos <key><member>
		geodist <key> member1 member2 单位 [m km mi ft]
		georadius <key><longitude><latitude>radius 单位 [m km mi ft]
			以给定的经纬度取到范围内半径内的元素
Redis配置文件 /etc/redis.conf
Redis发布和订阅:
	subscribe channel 订阅
	publish channel ...发布消息

Jedis:
*bind 地址需要注销、protected-mode no、防火墙关闭

Redis事务操作:

	是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行过程中
	不会被其他客户端发来的命令请求打断
	主要作用:串联多个命令,防止别的命令插队
	Multi、Exec、discard
		multi 组队
		exec 执行
		discard 放弃组队
	*组队中某个命令出现了报告错误,执行时整个队列都会被取消
	*执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他命令都会执行
	事务冲突:乐观锁和悲观锁
		Watch key 监视一个或多个key,如果在事物执行之前,这个或这些key被其他命令
		所改动,那么事务将被打断
		unwatch 取消对所有key的监视
	Redis事务三特性:
		1.单独的隔离操作:
			事务中的所有命令都会序列化,按顺序执行。事务在执行过程中不会被其他客户端发来的
			命令请求所打断
		2.没有隔离级别的概念:
			队列中的命令没有提交之前不会实际被执行,因为事务提交前任何指令都不会被实际执行
		3.不保证原子性:
			事务中如果有一条命令执行失败,其他的命令仍会被执行,没有回滚
		ab工具模拟并发 ab -n 请求次数 -c 并发数 ...

Redis持久化:

	RDB:(Redis DataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘
		最后一次持久化,可能数据丢失
		Fork,复制一个与当前进程一样的进程,作为原进程的子进程
		*写时复制技术
		优势:适合大规模的数据恢复
			对数据的完整性和一致性要求不高更适合使用
			恢复时间块
		劣势:2倍的空间
	AOF:Append Only File
		以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来,只许追加文件
		但不可以改写文件
		开启:配置文件中 appendonly yes
		AOF和RDB同时开启,系统默认取AOF的数据
		修复:redis-check-aof --fix ...
		优势:1.备份机制更稳健,丢失数据概率更低
			2.可读的日志文本,通过操作AOF稳健,可以处理误操作
		劣势:1.比RDB占用更多磁盘空间
			2.恢复备份速度慢
			3.每次读写都同步的话,有一定的性能压力
			4.存在个别bug
		AOF持久化流程:
			1.客户端的请求写命令会被append追加到AOF缓冲区内
			2.AOF缓冲区根据AOF持久化策略[always、everysec、no]将操作sync同步到磁盘
				的AOF文件中
			3.AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件
				容量
			4.Redis服务重启,会load加载AOF文件中的写操作达到数据恢复的目的

Redis主从复制:

	主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Skave以读为主
	*读写分离,性能扩展
	*容灾快速恢复
	搭建一主多从:(appendonly no)
		1.创建/myredis文件夹
		2.复制redis.conf配置文件到文件夹中
		3.配置一主多从,创建多个配置文件
		4.在配置文件中写
			include /myredis/redis.conf
			pidfile /var/run/redis_6379.pid
			port 6379
			dbfilename dump6379.rdb
		redis-sever redis.conf 开启服务...
		info replication 查看当前主机的运行状况
		redis.cli -p 端口号 
		在从机上执行 slaveof <ip><port> 
	一主二仆:
		从服务器挂掉,重启需要再次确定从机,确定后自动将主机的数据复制到从机
		主服务器挂掉,从机不变,重启主机也不变
	主从复制原理:
		1.从服务器连接上主服务器后,从服务器向主服务器发送进行数据同步消息
		2.主服务器接受到从服务器发送过来同步消息,把主服务器数据进行持久化
			rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
		3.每次主服务器进行写操作后,和从服务器进行数据同步
	薪火相传:
	反客为主:slaveof no one 将从机变为主机
	哨兵模式:反客为主自动版
		1./myredis中创建 sentinel.conf文件,
			sentinel monitor mymaster 主机ip 端口号  1(至少有多少个哨兵同意迁移的数量)
		2.redis-sentinel sentinel.conf 启动哨兵
	1.新主登基:从下线的主服务器的所有从服务里面挑选一个,将其转为主服务器
		选择条件依次:
			1.选择优先级靠前的
				在redis.conf 中 replica-priority 优先值 值越小优先级越高
			2.选择偏移量最大的(获得原主机数据最全的)
			3.选择runid最小的从服务(每个redis实例启动后都会随机生成一个40位的runid)
	2.群仆俯首:挑选出新的主服务后,sentinel向原主服务的从服务发送slaceof 新主服务的命令,复制新master
	3.旧主俯首:当已下线的服务重新上线时,sentinel会向其发送slaveof命令让其成为新主的从

Redis集群:

Redis集群实现了对Redis的水平扩容、通过分区来提供一定程度的可用性
	cluster-enabled yes
	cluster-config-file nodes-端口号.conf
	cluster-node-timeout 时间
	redis-cli --cluster create --cluster-replicas 1 ip:端口号
		replicas 1 最简单的方式配置集群
	redis-cli -c -p 集群方式连接
	cluster nodes 集群信息
	*分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在同一个IP
	slots:插槽
		一个redis集群,有16384个插槽 0-16383
		数据库中每个key属于一个插槽,有相对的公式计算
		cluster keyslot key  得到插槽值
		cluster countkeysinslot 插槽号 查看插槽的值
		cluster getkeysinslot 插槽号 值 查看key
	故障恢复:某台主机挂掉,从机会变为主机,原主机重启,会变为之前从机的从机
	如果某一段插槽的主从都挂掉:cluster-require-full-coverage 
		yes:真个集群都挂掉
		no:该插槽的数据全部不能使用,也无法存储

Redis应用过程问题:

	缓存穿透:1.应用服务器压力变大、2.redis命中率降低、3.一直查询数据库
		现象:1.redis查询不到数据、2.出现很多非url访问
		解决:1.对空值缓存
			2.设置可访问的名单(白名单)
			3.采用布隆过滤器
			4.进行实时监控
	缓存击穿:1.数据库访问压力瞬间增加、2.redis里面没有出现大量key过期
		2.redis正常运行
		问题:1.redis某个key过期了,大量访问使用这个key
		解决:1.预先设置热门数据
			2.实时调整
			3.使用锁
	缓存雪崩:1.数据库压力变大服务器奔溃
		问题:1.在极少的时间段,查询大量key的集中过期情况
		解决:1.构建多级缓存架构
			2.使用锁或队列
			3.设置过期标志更新缓存
			4.将缓存失效时间分散
	分布式锁:setnx key value 设置锁
		可以设置key的过期时间,自动释放
		set key value nx ex 过期时间 上锁+过期时间
		UUID防止锁的互删
		LUA脚本保证删除操作原子性

Redis6新功能:

	ACL:Access Control List 访问控制列表
		acl list  用户权限列表
		acl cat	查看命令
		acl setuser ... on >password ...
		auth 用户名 密码 切换用户
	IO多线程
	Cluster工具
  • 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、付费专栏及课程。

余额充值