redis induction

We first need to introduce nosql database:

1没有声明性的查询语言
2没有预定义的模式
3最终一致性 而非ACID属性
4非结构化和不可预知的数据
5CAP定理  三选二 不可能全满足
6高性能,高可用性和可伸缩性

**

The basic operation of key

**

redis默认有16个数据库:
			CONFIG  GET   databases;		获取某个配置项的值
			DBSIZE	获取当前数据库里面有多少个数据
			select 进行切换数据库

	●KEYS  匹配表达式   可以把相匹配的key查找出来  *表示很多字符  ?表示一个任意字符
	●TYPE KEY		返回某一个键对应的值的类型
	●MOVE KEY DB   把键值对移到某个数据库中
	●DEL  多个KEY  	根据KEY进行删除 返回成功删除的个数
	●EXISTS  多个KEY		返回存在的KEY的数量
	●RANDOMKEY			在现有的KEY中随机返回一个
	●RENAME KEY NEWKEY		重命名,会导致覆盖
	●RENAMENX KEY NEWKEY		重命名,不允许覆盖
	●TIME			返回当前UNIX时间戳
	●TTL KEY		查看存活时间 (秒  -1就是永久)
	●PTTL KEY		查看存活时间 (毫秒)
	●EXPIRE KEY SECONDS		设置过期时间
	●EXPIREAT KEY TIMESTAMP		设置一个KEY在TIMESTAMP指定的时间过期
	●PEXPIRE KEY MILLISECONDS		以毫秒为单位指定过期时间
	●PERSIST KEY			设置为永久的key
		 

**

value operations

**

首先知道redis的value有五大数据类型    
(1)string类型
(2)list类型
(3)hash类型
(4)set类型
(5)zest类型


(1)string类型		是二进制安全的 可以包含任何数据
	●SET KEY VALUE [EX SECONDS] [PX MILLISECONDS] [NX|XX]
	 								存活秒数 				毫秒数						key不存在才行|key存在才行
	●GET KEY		获取String类型的value 
	●APPEND KEY VALUE      在key对应的value后面追加值,返回值是追加后字符串长度
	●STRLEN KEY        字符串长度
	●INCR KEY			+1
	●DECR KEY			-1
	●INCRBY KEY INCREMENT		原值+INCREMENT
	●DECRBY KEY DECREMENT		原值-DECREMENT
	●GETRANGE KEY START END		从字符串中取指定的一段
	●SETRANGE KEY OFFSET VALUE		替换字符串中的一段值
	●SETEX KEY SECONDS VALUE		跟ex参数一样
	●SETNX KEY VALUE 	跟nx参数一样
	●MSET KEY VALUE [KEY VALUE ...]	一次性设置多个键值对
	●MGET KEY [KEY ...]		一次性指定多个KEY,返回它们对应的值,没有值的返回nil
	●MSETNX KEY VALUE [KEY VALUE ...]	一次性新建多个值
	●GETSET KEY VALUE		设置新值,同时将旧值返回

(2)list类型   是两端都可以压入弹出的结构		所以头尾效率高,中间效率低
	●LPUSH key value [value ...]
	●RPUSH key value [value ...]
	●LRANGE key start stop
		根据list集合的索引打印元素数据    0  -1可以打印全部
		正着数:0 1 2 3 4 5 。。。
		倒着数:。。。-5 -4 -3 -2 -1 
	●LLEN key		返回list的总长度
	●LPOP key	 	弹出左边的元素并且从list中删除
	●RPOP key		弹出右边的元素并且从list中删除
	●RPOPLPUSH source destination			从source中RPOP一个元素,LPUSH到destination中
	●LINDEX key index		根据索引从集合中取值
	●LINSERT key BEFORE|AFTER pivot value		在list中插入value 位置放在pivot的前面或者后面
	●LPUSHX key value	只能针对存在的list执行LPUSH
	●LREM key count value		删除左边count个元素
	●LSET key index value		替换元素
	●LTRIM key start stop		仅保留指定区间的数据,两边的数据被删除

(3)set类型  (就相当于在一个集合中放进去值 没有顺序)
    ●SADD key member [member ...]	放进一个键值对
	●SMEMBERS key		查看value
	●SCARD key	返回集合中元素的数量  
	●SISMEMBER key member	检查当前指定member是否是集合中的元素 是返回1 不是返回0
	●SREM key member [member ...]    根据key删除集合中的元素
	●SINTER key [key ...]		返回两个集合中交集的部分
	●SINTERSTORE destination key [key ...]
		取交集后存入destination
	●SDIFF key [key ...]	返回集合1减去集合2的的部分
	●SUNION key [key ...]			返回并集
	●SDIFFSTORE destination key [key ...]			保存到destination中
	●SUNIONSTORE destination key [key ...]		保存到destination中
	●SMOVE source destination member			把member从source移动到destination
	●SPOP key [count]			从集合中随机弹出count个数量的元素,count不指定就弹出1个	弹出完就没了
	●SRANDMEMBER key [count]		从集合中随机返回count个数量的元素,count不指定就返回1个		弹出的话原本元素还在里面
	●SSCAN key cursor [MATCH pattern] [COUNT count]			基于游标的遍历  0表示结束

(4)HASH			键值对  值又是键值对
	●HSET key field value		设置键值对
	●HGETALL key			返回全部
	●HGET key field			返回一个
	●HLEN key				返回长度	
	●HKEYS key			返回hash中的所有键
	●HVALS key			返回hash中的所有值
	●HEXISTS key field		判断hash中的键是否存在
	●HDEL key field [field ...]	删除对应的键值对
	●HINCRBY key field increment		加上
	●HMGET key field [field ...]			一次性获取多个值
	●HMSET key field value [field value ...]		一次性设置多个值
	●HSETNX key field value		要求hash中的键是新建的
	●HSCAN key cursor [MATCH pattern] [COUNT count]			基于游标对hash进行遍历

(5)zset     键值对 值是数字    最后按照数字进行排队
	●ZADD key [NX|XX] [CH] [INCR] score member [score member ...]		增加键值对
	●ZRANGE key start stop [WITHSCORES]			返回这个区间的值
	●ZCARD key				返回集合中元素的数量
	●ZCOUNT key min max					查找在min,max之间的元素
	●ZSCORE key member					获取对应的数字
	●ZINCRBY key increment member		加一个数
	●ZLEXCOUNT key min max			
	●ZRANGEBYLEX key min max [LIMIT offset count]
		按照字母顺序在区间内返回member 所以填的是字母
		min和max使用“[a”表示闭区间,使用“(a”表示开区间
		-表示负无穷
		+表示正无穷
	●ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
		在分数的指定区间内返回数据
	●ZRANK key member			返回分数对应的排名
	●ZREM key member [member ...]
	●ZREMRANGEBYLEX key min max
	●ZREMRANGEBYRANK key start stop
	●ZREMRANGEBYSCORE key min max
	●ZREVRANGE key start stop [WITHSCORES]
	●ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
	●ZREVRANK key member
	●ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
	●ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
		把指定集合的member取交集,分数会相加
	●ZSCAN key cursor [MATCH pattern] [COUNT count]

**

redis configuration information presentation

You can start the cluster according to multiple profiles start
**

redis的配置文件:
	includes :可以用include包含其他的配置文件  用在你将配置文件分成多个的情况下
	bind 绑定的ip才可以访问redis			一般注释掉 然后配置密码
	port 监听的端口号
	timeout  超时时间    0表示没生效
	daemonize yes   后台运行
	pidfile	存放进程id  这个值会经常性改变的  跟端口号不一样
	loglevel    日志级别
	logfile 指定日志文件的地址  空字符串表示标准输出中打印(直接在前台打印 但是如果用的是daemonize 日志会被送到 /dev/null)
	databases 16   表示有16个数据库
	SNAPSHOTTING   rdb持久化方式的配置地方
	replication 跟主从复制有关的配置
	Security 跟安全有关
	requirepass 设置密码
	maxclients 最大客户端的配置
	APPEND ONLY MODE          aof处久化方式的配置地方

**

redis persistence

		及相关的配置

**

1 RDB		每隔一定的时间把内存的数据保存到硬盘上
				save   A秒   B次			A秒内有B次修改就保存			
				不可以保证数据的绝对安全,而且通常不会在redis中只有一份 mysql中也可以保存一份并且 
				如果redis做二级缓存(经常查询 很少修改  ,不是特别重要允许出现偶尔的并发问题,
				不会被其他应用程序修改不和其他应用程序共享的),重要 完全不能丢失的数据不会放在redis中
	(1)默认启动,想要禁用RDB的话就删除save
	(2)持久化文件名 253 行dbfilename      配置主从集群的时候就需要改这个名字  
				持久化文件保存路径 263 dir ./   表示的是你从哪个路径启动的redis  就会保存在哪里 所以一般指定一个绝对路径 /usr/local/redis
		(3)BGSAVE  stop-writes-on-bgsave-error  yes/no	no表示后台写入错误也不处理不在乎数据不一致
	(4)数据压缩 rdbcompression yes 对于存储到磁盘中的快照    可以设置是否进行压缩存储 	是硬盘资源和cpu资源之间的权衡
	(5)rdbchecksum   yes  存储快照后 还可以让redis使用CRC64算法来进行数据校验  会消耗10%的性能消耗
	
2 AOF		不保存数据本身  保存生成数据的命令				rdb是二进制文件不可读   AOF还有可读性
	(1)默认关闭 appendonly yes  改成yes
	(2)核心策略:
				701 appendfsync always   每条命令都保存
				702 appendfsync everysec  每秒执行一次保存(默认)
				703 appendfsync	no		不保存
	(3)AOF重写:
				文件增加到一定的大小的时候 可以进行AOF重写 把好几条命令合成一条命令
				auto-aof-rewrite-percentage 100 表示文件翻了一倍的时候进行重写
				auto-aof-rewrite-min-size 64mb  表示超过了64mb进行重写
	(4)AOF持久化文件的修复
				/usr/local/bin/redis-check-aof --fix appendonly.aof 把坏的切掉了  
				/usr/local/bin/redis-check-rdb --fix	rdb也可以用类似命令

**

redis transaction-related commands

**

MULTI 
	好几个命令
EXEC
这几个命令先不执行  EXEC的时候开始一起执行  其中一个错误的话就会全部都不执行但是入队的时候没有检测到错误是不会回滚的

WATCH之后才进入事务的话:在EXEC之前如果有别人操作了 那么这一串事务作废

**

Optimistic and pessimistic locking

**

乐观锁:不锁定数据 以达到更好的性能 万一发生了碰撞 放弃自己的操作 不会导致数据的不一致
				redis

悲观锁:操作钱锁定数据 避免数据的不一致

**

redis publication subscriptions

**

SUBSCRIBE  订阅频道
PUBLISH 发布

**

Master-slave replication cluster

**

配置多个配置文件  分别启动	INFO replication查看主从服务器状态

(1)默认都认为自己是master
(2)SLAVEOF 设置为另外一个master的奴隶		SLAVE no one 变成master
(3)主机可以写 从机自动同步 但是从机只能读   因为有配置slave-read-only yes
(4)从机shutdown后重新登陆会变成master	只有SLAVEOF后才能获得这期间的数据
(5)主机shutdown后从机还是slave 主机登陆后还是master

**哨兵模式**
一般哨兵会配置多个 防止判断失误
		主观下线:只有一个哨兵认为下线了
		客观下线:达到配置的个数的哨兵下线了就可以
(1)slave下线后会主动变成slave
(2)主机下线后会在从机中选取主机 主机回来后就是slave

**

jedis

Notes bind password requirepass
**

jedis直接连接:
		new Jedis();
		jedis.auth();
		jedis.ping();
		jedis.close();
连接池:
		new GenericObjectPoolConfig()  new Jedispool()  getResource()	  都得关闭
Published 63 original articles · won praise 44 · views 6257

Guess you like

Origin blog.csdn.net/weixin_40695328/article/details/92838667