Redis基本理念
传统的ACID:
- A:原子性
- C:一致性
- I:独立性
- D:持久性
Redis中的CAP:
- C:强一致性
- A:可用性
- P:分区容错性
CAP的三进二原则
- AP:大多数网站架构的选择
- CP:Redis Mongodb
- CA:传统Oracle数据库
BASE:
- BA:基本可用
- S:软状态
- E:最终一致
Redis的特点
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候再次加载
- Redis支持简单的key-value类型,还提供list,set,zset,hash等数据结构的储存
- Redis支持数据的备份
Redis的五大数据类型
- Sting 字符串
- String类型是二进制安全的,可以保存任何数据,包括jpg或者序列化的对象
- redis中的字符串value最大可以512m
- Hash 哈希 类似java中的map
- redis hash是一个键值对集合
- redis hash是一个string类型的field和value的映射表,hash特别适合用于储存对象
- List 列表
- Set 集合
- Zset 有序集合
Redis常用命令
Redis字符串(String):
- exists [key]:判断某个key是否存在,如果存在则返回数量.不存在则返回0
- move [key] [数据库序号]:将当前库中的某个key移动到目标数据库中
- expire [key]:给指定的key设置过期时间
- ttl [key]:查看目标key还有多长时间过期,-1表示永不过期,-2表示已经过期.单位为秒
- keys * :查看当前库中的所有key,可以使用通配符
- type [key]:查看目标key是什么数据类型
- strlen [key]:查看目标key的长度
- append [key] [string]: 向key中追加内容
- incr [key]:使目标key的值+1 (incrby [key] [num]增加指定数量)
- decr [key]:使目标key的值-1 (decrby [key] [num]减少指定数量)
- getrange [key] [start] [end]:获取key中指定区间中的值
- setrange [key] [start] [end]:覆盖key中指定区间中的值
- setex [key] [time] [value]:添加key-value时并指定过期时间
- setnx [key] [value]:如果目标key不存在则添加,存在则添加失败
Redis列表(LIst):
- lpush [列表名] [值1 值2 值3 …]:从列表左边添加元素(右边rpush)
- lpop [列表名]:弹出最坐边的一个元素(右边rpop)
- lrange [列表名] [起始位置] [结束位置]:列出列表中从起始位置到结束位置的元素(全部元素为0 -1)
- lindex [列表名] [索引号]:找出列表中指定位置的元素
- llen [列表名]:返回值为列表的长度
- lrem [列表名] [n] [value]:从列表中删除n个value
- ltrim [list] [start] [end]:从list中截取start-end的值并附给list
- linsert [list] [before/after] [value1] [value2]:在value1后面插入value2
Redis集合(Set):
- sadd [set] [value1] [value2] …:向set中添加value1,value2,…元素(非重复)
- smembers [set]:查看set中的所有元素
- sismember [set] [value]:查看set中是否含有value,若有则返回1,无则返回0
- scard [set]:查看set中的元素个数
- srem [set] [value]:删除set中的value
- srandmember [set] [num]:在set中随机取出num个元素
- spop [set]:在set中随机pop一个元素,并在set中删除
- smove [set1] [set2] [value]:将set1中的value移动到set2中(移动后set1中不含value)
- sdiff [set1] [set2]:求set1对set2的差集
- sinter [set1] [set2]:求set1和set2的交集
- sunion [set1] [set2]:求set1和set2的并集
Redis哈希(Hash):
- hset [key] [k1] [v1] [k2] [v2] …:向key中添加k1-v1,k2-v2键值对
- hget [key] [k]:取出key中的k的v值
- hmset [key] [k1] [v1] [k2] [v2]…:批量设置key的键值对
- hmget [key] [][][k1] [k2]…:批量取出key中k1,k2…的值
- hgetall [key]:将key中所有键值对全部取出(取出的格式为key,value,key,value…)
- hdel [key] [k1] [k2]…:将key中健为k1,k2…的键值对删除
- hexists [key] [k]:查看key中是否有键为k的键值对,有则返回1,没有则返回0
- hkeys [key]:查看key中所有的健
- hvals [key]:查看key中所有的值
- hincrby [key] [k] [num]:将key中的键为k的值自增num(如果为float类型数据使用incrbyfloat)
- hsetnx [key] [k1] [v1]:如果key中不存在k1则插入并返回1,否则返回0
Redis有序集合(Zset):
- zadd [set] [score1] [value1] [score2] [value2]…:向set中添加score1,value1,score2,value2
- zrange [set] [start] [end]:取出set中从start到end之间的元素(withscores可以将分数也显示出来)
- zrangebyscore [key] [score1] [score2]:将key中score1和score2之间的元素显示出来(默认为闭区间,如果在分数前加(则表示为开区间)(如果最后加limit则可类比mysql中的分页查询,如limit 2 2表示将结果中从第二个开始截取两个显示出来)
- zrem [set] [value1] [value2] [value3]… :将set中的value1,value2,value3…移除
- zcount [set] [score1] [score2]:查询在score1和score2之间的元素个数
- zcard [set]:查询set中所有元素个数
- zrank [set] [value]:查询目标value在set中的位置下标
- zscore [set] [value]:查询value对应的score值
- zrev前缀用来查询逆序集合,可用:zrevrank,zrevrange,zrevrangebyscore
RedisRDB
触发方式
-
Redis数据持久化方式之一
-
自动触发:
- 可在配置文件中配置持久化方式,如15分钟改动1次,5分钟改动20次,1分钟改动10000次.sava 900 1.sava 300 20.save 60 10000.( save m n ,m为秒数,n为变化次数)
-
手动触发:
- 1.当在redis命令行中执行save命令时(阻塞redis服务器,不能执行其他命令)
- 2.当执行flushall时(此时dump.rdb为空,无意义)
- 3.当执行bgsave时(异步操作,此时会fork一个子进程,redis此时可以执行其他命令,阻塞只发生在fork时)
-
stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
-
rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
-
**rdbchecksum :**默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
-
dbfilename :设置快照的文件名,默认是 dump.rdb
-
**dir:**设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。
也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配置的 dbfilename 决定。
恢复方式
当Redis重新启动时会自动读取目录下的dump.rdb文件(加载文件期间Redis为阻塞状态,直到文件加载完成)
Redis AOF
基本介绍
- aof有三种追加操作指令的方式,分别是appendfsync always/everysec/no.分别表示一致同步,每秒同步(推荐使用)和不同步
- aof文件若不能读取,可以使用redis的修复aof文件工具
- 在数据量相同的情况下,aof文件的体积要大于rdb文件体积,且恢复效率低于rdb文件
- aof运行效率也低于rdb文件,每秒同步策略效率较好,不同步效率和rdb相同
- 如果与rdb同时启用的话,默认先加载aof文件
- aof保存的数据要比rdb文件更加完整
- 不推荐只是用aof方式
开启方式
- 在redis-conf文件中开启appendonly yes
- 需要恢复数据时加入参数aof文件的地址
- 默认文件名为appendonly.aof
关于rewrite
- 默认触发规则为当aof文件为上次重写的两倍且大于64m时进行重写
- 重写可以减小aof文件的体积
Redis事务
命令
- multi:标志一个事务块的开始
- exec:执行事务块内的所有命令
- discard:放弃事务块内所有命令的执行
- unwatch:取消watch命令对所有key的监视
- watch key [key…]:监视一个或者多个key,如果其中任意一个key有所改动,则事务将被打断
Redis消息订阅/发布
- publish [channel] [msg]:向channel中发布msg消息
- subscribe [channel]:订阅channel中的消息(支持通配符的方式)
Redis主从复制
1.一主二从
- 一个主机,两个从机
- 从机上使用命令 slaveof [ipaddress] [port] 来复制主机内容
- 使用info replication来查看当前是主机还是从机
- 主机宕机后,从机待命; 从机宕机后,与主机断开连接,若无配置则重新上线后默认为主机.
2.薪火相传
- 主机从机的关系类似于链表节点关系
- 任意一个节点宕机以后都会影响后续节点
3.反客为主
- 当主机宕机以后,从机可以使用slaveof no one命令来重新成为主机
4.哨兵模式
- 在linux使用redis-sentinel [sentinel.conf文件路径]开启哨兵模式
- 在配置文件中加入 sentinel monitor [主机别名] [ip地址] [端口号] [投票数] 来配置主机及主机宕机后从机的选举票数
- 主机宕机后,redis-sentinel会根据投票结果在从机中选取一个当作主机,其他从机归属到选举出的主机下,若选举完成后主机上线,则主机默认当作新选举的主机的从机.
- 可以配置多个哨兵进行监控