redis入门

redis入门

redis

**概念**:
	用于kv存储,查询快,解决mysql在千万级别查询慢的问题(mysql使用的是IO),比IO更快的是什么->内存,所以redis用内存,或者说是缓存;它提供原子性的操作(实际是单线程操作(多线程操作是并发))
**解释**: 
	redis的定位是缓存,提高数据读写的速度,减轻对数据库存储和访问的压力;(但是因为在内存中,所以不建议存储敏感数据)当然可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;

1、mac安装参考教程
https://blog.csdn.net/realize_dream/article/details/106227622

2、一些常用命令
注:实在懒得手打了,缺失的部分有需要在查吧

常用命令 :注意k是string的字符串,但是v可以是比较复杂的数据结构(暂时不记支持哪些)

简单map string命令(优点方便查询)
   	命令    									功能	
   	set key value  							将k-v缓存到redis中 
	get key 									获取对应key的值
	incr key 									对应key值++
	decr key									对应key值--
	setex key seconds value 		kv暂存,但是seconds后就会失效
	ttl key										查看key存活的时间
	del key										删除key
	setnex key value 					如果key已经存在,不操作,key不存在的时候,直接添加
复合map hash命令 <key, <v1, v2>>命令 (优点方便删改)
	命令														功能
	hset key field value 						将vn存入k中
	hget key field 									从k中获取某个vn
	hexists key field								判断key对应的hash列表中是否有vn
	hincrby key field increment 			给key对应的hash列表中vn加上某个数值
	hlen key											查看key对应的hash列表长度
	hkeys key										查看key对应的所有vn名称
	hvals key											查看key对应的所有vn的值
	hgetall key										查看key对应的所有vn名称及值
复合map list/dueue命令 <key, list/deque> (用于用户收藏列表等场景)
	 命令														功能
	 rpush key value								右边队列加入数据
	 lrange key start stop 						从左边开始返回从start到stop的v,这个stop位置可以大于n
	 lpush key value								从左边往队列/链表里加数据
	 lpop key											左边弹出数据
	 rpop key											右边弹出数据
	 llen	key											获取list长度
复合map set命令  <key, set/hashtable> (set中v不能重复添加、存储hash无序,spop是随机的,所以可以用于去重和抽奖)
	命令														功能
	sadd key value								向k中的set添加数据
	smembers key									打印k中的set值
	srem key value								删除key中某个v
	spop key											随机弹出一个v
	sdiff key1 key2								计算key1比key2少的数据
	sinter key1 key2								计算key1和key2的并集
	sunion key1 key2							计算key1和key2的并集
复合map zset  <key, zset>(zset中的数据是有序的,所以会用于各种排名比较场景中)
	命令														功能
	zadd key score member 					向key集合中添加v元素并且设置它的score
	zincrby  key increment member		key中v的值+increment
	zrange key start stop						将key中的元素按照升序排列
	zrevrange key start stop					将key中元素按倒序排列
	zrank key member							返回v按照score的正序排列
	zrevrank key member						返回v按照score的倒序排列
	zcard key											返回key集合的个数

全局命令 对整个数据库生效的常用命令(懒得打了,后续有需要在查询)
命令 功能
keys pattern pattern是正则表达式,意思寻找符合条件的keys
exists key 判断key是否存在
expire key seconds 给key设置过期时间,单位秒
persist key 取消key过期的时间

	redis 示例
 redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> hset student name zh
(integer) 1
127.0.0.1:6379> hset student age 18
(integer) 1
127.0.0.1:6379> hset student sex girl
(integer) 1
127.0.0.1:6379> hget student name
"zh"
127.0.0.1:6379> hget student age
"18"
127.0.0.1:6379> hget student sex
"girl"
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hexists student names
(integer) 0
127.0.0.1:6379> hincrby student age 1
(integer) 19
127.0.0.1:6379> hincrby student age 2
(integer) 21
127.0.0.1:6379> hincrby student age -2
(integer) 19
127.0.0.1:6379> hincrby student name 1
(error) ERR hash value is not an integer
127.0.0.1:6379> hlen student
(integer) 3
127.0.0.1:6379> hkeys student
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals student
1) "zh"
2) "19"
3) "girl"
127.0.0.1:6379> hgetall student
1) "name"
2) "zh"
3) "age"
4) "19"
5) "sex"
6) "girl"
127.0.0.1:6379>

127.0.0.1:6379> rpush student2 name zh2
(integer) 2
127.0.0.1:6379> rpush student2 age
(integer) 3
127.0.0.1:6379> rpush student2 sex
(integer) 4
127.0.0.1:6379> lrange students start stop
(error) ERR value is not an integer or out of range
127.0.0.1:6379> lrange students 0 1
(empty array)
127.0.0.1:6379> lrange students 0 2
(empty array)
127.0.0.1:6379> lrange student2 0 2
1) "name"
2) "zh2"
3) "age"
127.0.0.1:6379> lrange student2 0 9
1) "name"
2) "zh2"
3) "age"
4) "sex"
127.0.0.1:6379> lpush student2 left
(integer) 5
127.0.0.1:6379> lpop student2
"left"
127.0.0.1:6379> rpop student2
"sex"
127.0.0.1:6379> llen student2
(integer) 3


127.0.0.1:6379> sadd set1 a b c d
(integer) 4
127.0.0.1:6379> sadd set2 a b b
(integer) 2
127.0.0.1:6379> sadd set2 a b bb c d
(integer) 3
127.0.0.1:6379> smembers set1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> smembers set2
1) "a"
2) "b"
3) "bb"
4) "c"
5) "d"
127.0.0.1:6379> srem set2  bb
(integer) 1
127.0.0.1:6379> smembers set2
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> spop se2 count
(error) ERR value is out of range, must be positive
127.0.0.1:6379> spop set2 1
1) "c"
127.0.0.1:6379> smembers set2
1) "a"
2) "b"
3) "d"
127.0.0.1:6379> sadd set2 a b bb c d
(integer) 2
127.0.0.1:6379> sdiff set1 set2
(empty array)
127.0.0.1:6379> sdiff set2 set1
1) "bb"
127.0.0.1:6379> sinter set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> sunion set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
5) "bb"


127.0.0.1:6379> zadd players 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> zincrby players 1 a
"2"
127.0.0.1:6379> zrange players 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrevrange players 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> zrank players a
(integer) 0
127.0.0.1:6379> zrevrank players a
(integer) 2
127.0.0.1:6379> zcard players a
(error) ERR wrong number of arguments for 'zcard' command
127.0.0.1:6379> zcard players
(integer) 3
127.0.0.1:6379>

3、使用redis的思考
1、是否需要缓存
2、是否一定要redis
3、缓存的是什么数据
4、如何设计kv对
请添加图片描述
注意使用string取巧的原因 : 将所有数据的格式转换为json格式,然后就能将其都存到一个string中了;其次如果存数据采用其他方式,获取出来还要再进行格式转换,所以如果是json的话,比较容易进行统一的格式转换。

K设计:
	唯一、可读性、灵活性、时效性

4、redis的性质

1、redis安全性:
		可以通过改conf文件,修改redis的登录密码
2、redis事务性
		redis事务:输入multi命令后,可以将多个命令放进一个缓存队列中,直到收到exec命令开始执行,如果其中的任意一条命令或几条执行失败,不会影响到其他的命令执行,在事务执行的过程中,其他客户端提交的命令请求不会插入到这个事务执行命令序列中;
3、redis持久化机制
		在redis执行过程中,会不定时将数据缓存至硬盘中,以此防止断电后,进行数据加载;
		
![请添加图片描述](https://i-blog.csdnimg.cn/direct/1288239d1ce547a787935baee4fc6789.png)
		目前持久化机制一共有3种,分别为: 
			1、快照方式 (把数据存储到RDB文件中)
				(手动命令行 save  阻塞其他命令,直到save完成
					 推荐bgsave  进程fork出子进程,然后由子进程实现RDB持久化
					 自动 save m n 在m秒内存在n个数据修改的时候,进行保存)
					 优点:这个RDB文件存储为一个压缩紧凑型的二进制文件,因此非常适合用于备份和全量复制的场景,开发中可以每6小时设置bgsave保存一次,用于容灾备份;
					 加载恢复数据的时候, 快于AOF方式;
					 缺点:无法做到实时、秒级持久化,每次bgsave需要fork子进程,频繁执行会有时间成本;RDB文件不同版本的格式不同,容易引起兼容问题;
			2、文件追加方式(AOF,将执行的命令存到日志中,断电重启后加载日志文件,然后在执行一遍)
						默认不开启,需要使用的时候进行配置,appendonly yes
								分三种策略:	appendsync always 	收到命令就写到磁盘,效率最低、存的最完整
														appendfsync everysec	每秒写入磁盘一次,平衡性能和持久化
														appendfsync no			完全依赖os,一般30s同步一次	
							优点:
										数据安全性更高、配置得当时,最多损失1s的数据量;
											在不小心执行flushall命令,也可以通过AOF方式恢复(删除最后一个命令即可);
											AOF是一个增量日志文件,不会存在断电损坏问题,即使出现,redis-check-aof也能恢复;
												当AOF过大的时候,redis能够在后台自动重写AOF
								缺点:
									相同数据量,AOF比RDB更大,
									数据持久化性能上,AOF比RDB慢;
																	
			3、持久混合方式,即综合以上两种;在写入的时候,先把当前的数据以RDB的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件;RDB作为全量备份,AOF做增量备份,提高备份效率,又能保证Redis重启的速度,和数据丢失的风险。

5、redis内存淘汰机制

1、内存淘汰算法:
	删除最近一段时间内,最长时间没有被使用到的数据
	删除最近一段时间内,使用次数最少的数据
	删除最近一段时间内,过期的数据
	随机删除数据
2、redis删除数据
	1、默认什么都不做,告诉你内存不足,保证数据不丢失(no-enviction)
	2、选择全体数据/过期数据 * 结合以上内存淘汰算法进行删除
3、过期key处理
	1、惰性删除
		当访问key 的时候,才去判断是不是过期,过期进行删除,这样对cpu比较友好,但是这个key会一直存在内存里,造成内存浪费
	2、定时删除
		设置键的过期时间,创建一个定时器,当到达时间的时候,立即执行对key的删除操作,这种方式对cpu不友好,得额外定时维护;
	3、定期删除
		隔一段时间,对数据进行检查,删除里面过期的key,至于删除多少过期的key,检查多少数据,由算法决定。
	redis配合使用惰性删除和定期删除。

6、redis发布订阅
参照正常生活中订阅一个公众号理解
请添加图片描述

参考资料

学习资料
redis中文地址
B站入门视频

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值