注意:这是个人笔记,如果有不正确的地方可以在评论指出,大神勿喷
Redis Key(键)
语法
COMMAND KEY_NAME
基本就是命令加键名
Redis Key 常用命令
命令 | 描述 |
---|---|
KEYS pattern | 根据模式匹配键 KEYS会阻塞线程 |
DEL key | 删除键 |
DUMP key | 序列化键,并返回值 |
EXISTS key | 检查键是否存在 |
MOVE key db | 移动键到db数据库 |
RENAME key newkey | 修改key的名称 |
TYPE key | 返回key的类型 |
EXPIRE key seconds | 设置key过期时间,单位秒 |
PERSIST key | 移除key的过期时间 |
PTTL key | 以毫秒为单位计算key的过期时间 |
TTL key | 以秒为单位计算key的过期时间 |
redis数据类型
- String(字符串)
- Hash(哈希)
- List(散列)
- Set(集合)
- zset(sorted set:有序集合)
String (字符串):
实例
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
此处使用了redis的SET和GET命令。
**注意:**一个键最多可以存储512MB。
常用命令
命令 | 描述 |
---|---|
SET key value | 设置key的值 |
SETNX key value | 如果key不存在则添加,如果存在则不操作 |
GET key | 获取指定key的值 |
GETSET key value | 重新给key赋值,并且返回旧值 |
STRLEN | 返回key所存储的字符串值长度 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETBIT key offset | 返回key指定offset偏移量上的位 |
SETBIT key offset value | 设置key指定offset偏移量上的位 |
MSET key1 [key2…] | 同时设置一个或多个 key-value 对 |
MGET key1 [key2…] | 同时获取一个或多个给定key的值 |
INCR key | 将key对应的值加一 |
INCRBY key increment | 将key对应的值加increment |
INCRBYFLOAT key increment | 与上同,不过加的是浮点数 |
DECR key | 将key对应的值减一 |
DECRBY key decrement | 将key对应的值减decrement |
APPEND key value | 如果key是已经存在的字符串,APPEND命令将value追加在key对应的值后面 |
Hash(哈希)
实例
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
此处使用HMSET和HGET命令,HMSET用来设置键值对field “value“,HGET获取对应field对应的value,每个Hash可以存储
常用命令
命令 | 描述 |
---|---|
HSET key field value | 添加单个域-值对 |
HMSET key field1 value1 [field2 value2] | 同时将多个域-值对加入哈希表中 |
HDEL key field1 [field2] | 删除哈希表多个字段 |
HEXISTS key field | 查看field在key中是否存在 |
HGET key field | 查找哈希表中field字段 |
HGETALL key | 查找哈希表中所有字段和值 |
HINCRBY key field increment | 给哈希表中field字段加increment |
HINCRBYFLOAT key field increment | 同上,加浮点数 |
HKEYS key | 获取哈希表中所有字段 |
HLEN key | 获取哈希表的长度 |
| HVALS key | 获取哈希表中所有值 |
List(列表)
redis列表是简单的字符串列表,按照顺序插入,可以从表尾插入或者从表头插入
实例
**注意:**列表最多存储
常用命令
命令 | 描述 |
---|---|
LPUSH key value1 [vlaue2] | 将一个或多个值插入到列表头部 |
RPUSH key value1 [vlaue2] | 将一个或多个值插入到列表尾部 |
LPOP key | 移除并获取列表第一个元素 |
RPOP key | 移除并获取列表最后一个元素 |
LLEN key | 获取列表长度 |
LREM key count value | 移除列表元素 count<0 从表头查找 count>0 从表尾查找 count=0 移除所有与value相等的元素 |
LTRIM key start end | 移除start到end以外的所有元素 |
LRANGE key start stop | 获取列表指定范围的元素 |
LINSERT key BEFORE or AFTER pivot value | 插入在pivot元素之前或之后 |
LSET key index value | 设置列表指定index的元素值 |
LINDEX key index | 获取list中index的值 |
RPOPLPUSH source destination | 从source右边弹出一个元素加入到destination左边,并返回这个元素 |
BLPOP key1 [key2] timeout | 移除并获取一个或多个列表表头第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOP key1 [key2] timeout | 移除并获取一个或多个列表表尾的一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
Set(集合)
redis的集合是无序集合。集合通过Hash实现,所以添加、删除、查找的复杂度都是O(1)。
集合的数据结构是散列表,存储元素的时候通过散列函数对不同元素的返回值(桶)来区分不同的元素,如果出现两个元素经过散列函数后的值相等,那么就在返回值(桶)中以链表的形式来存储返回值相同的元素.
sadd命令
添加string元素到key对应的set集合中,成功返回1,如果元素已存在,返回0,否则返回错误。
sadd key member
实例
常用命令
命令 | 描述 |
---|---|
SADD key member1 [member2…] | 向集合添加一个或多个成员 并且返回不存在元素的个数 |
SREM key member1 [member2…] | 从集合中删除一个或多个成员 |
SCARD key | 获取集合的成员数量 |
SMEMBERS key | 获取集合所有元素 |
SISMEMBER key member | 判断元素是否存在于集合 |
SDIFF key [key…] | 返回多个集合的差集 |
SINTER key [key…] | 返回多个集合的交集 |
SUNION key [key…] | 返回多个集合的并集 |
SDIFFSTORE destination key [key…] | 进行差集并将结果存储到destination |
SINTERSTORE destination key [key…] | 交集 |
SUNIONSTORE destination key [key…] | 并集 |
SRANDMEMBER key [count] | 当count大于零时,返回集合中随机不重复count个元素, 当count小于零时,返回集合中随机(可能重复)count个元素 |
SPOP key | 弹出集合中随机的元素 |
Zset(sorted set 有序集合)
Zset同Set基本结构差不多,同样,元素也是string,并且不允许有重复元素。
但是,Zset中每个元素关联了一个double类型的分数,用来对元素进行排序
Zset中元素不可以重复,但是分数可以重复
有序集合和列表的区别:
- 列表通过链表实现,取到中间的数速度会很慢,所以适合做"新鲜事"等访问中间元素少的应用,有序集合使用散列表或跳跃表实现,所以取出中间元素的速度比较快.时间复杂度是O(log(N))
- 列表不能简单地调整某个元素的位置,有序集合可以通过修改分数来改变位置.
- 有序集合比列表更耗内存.
实例
常用命令
命令 | 描述 |
---|---|
ZADD key score member [score member…] | 向有序集合添加一个或多个成员 如果元素已存在 则修改该元素的分数 并且返回新添加元素的个数 |
ZSCORE key member | 获取元素的分数 |
ZRANGE key start stop [WITHSCORES] | 获取有序集合的某个范围的元素 WITHSCORES附加属性可以显示元素的分数 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]] | 根据有序集合元素的分数获取元素 可选属性WITHSCORES与ZRANGE相同 offset是偏移量 count是offset后的几个元素 |
ZINCRBY key increment | 增加某个元素的分数 返回值是修改后的元素分数 |
ZCARD key | 获得有序集合的元素个数 |
ZCOUNT key min max | 获得元素分数在min和max之间的yuan’su |
ZREM key member [member…] | 删除有序集合的元素 返回成功删除的元素个数 |
ZREMRANGEBYSCORE key min max | 根据max和min分数删除有序集合中的元素 |
ZREMRANGEBYRANK key start stop | 根据start和stop删除有序集合的元素 索引0表示最小的数 |
ZRANK key member | 获取指定元素的排名(从小到大) |
ZREVRANK key member | 与上相反 |
事务
同Mysql中,Redis中的事务也是具有原子性的,但是Redis中的事务不存在rollback功能,如果执行错误,并不会影响后面的执行.
WATCH命令:可以持续监控某个键值,在该键值被修改后,阻止之后的事务执行.
UNWATCH命令:取消WATCH命令的监视.
持久化
在Redis中分为RDB和AOF两种方式进行持久化.
RDB
RDB持久化是通过快照(snapshotting)完成的,达到一定条件,系统会自动保存当前数据库中数据,并且生成一份备份保存在硬盘中.
Redis会在下面的情况下对数据进行快照:
- 根据用户配置规则进行自动快照
- 用户执行SAVE或BGSAVE命令
- 执行FLUSHALL命令
- 执行复制时
根据用户配置规则进行自动快照
SAVE time number
通过在配置中添加SAVE命令来进行自动快照
time是多长时间内 单位是秒
number是多少个键被修改
用户执行SAVE或BGSAVE命令
SAVE命令:
当执行SAVE命令的时候,系统会阻塞所有客户端的请求.当数据库中数据过多的时候,会导致Redis长时间未响应.所以生产环境当中很少使用.
BGSAVE命令:
BGSAVE命令是后台异步执行快照保存,快照的同时服务器还可以响应客户端的请求.
执行FLUSHALL命令
只有在配置自动快照后,FLUSHALL命令执行后才会执行快照
执行复制时
设置主从模式后,Redis会在复制初始化时进行自动快照
AOF
AOF(append only file)会将Redis执行的每一条命令追加到硬盘文件中.
AOF会将无用的命令删除不会保存下来.比如:
SET key 1
SET key 2
AOF中只会保留SET key 2一个命令.
AOF如果不重写AOF文件的话,性能的影响比较小,但是AOF文件会越来越大,AOF文件过大会影响Master重启的回复速度.所以Master最好不要做持久化,如果数据比较关键,可以在Salve中做AOF持久化,策略为一秒一次.
主从模式
Redis提供复制功能,可以实现当一台数据库中的数据更新后,自动将数据同步到其他数据库.
在复制的概念中,数据库分为两类:主数据库(Master)和从数据库(Salve)
主数据库可以进行读写操作,而从数据库一般是只读的.
一个主数据库可以有多个从数据库,但是一个从数据库只能有一个主数据库.
复制功能使用只需要在配置文件中加入salveof 主数据库地址 主数据库端口
原理
当一个从数据库启动后,会向主数据库发送SYNC命令,主数据库收到SYNC命令后会在后台开始保存快照(RDB),并且将保存快照期间收到的命令缓存起来.当快照完成后,主数据库会将快照和缓存命令发给从数据库.
注意:
- Redis2.6及之间版本如果主从数据库断开后,当从数据库再次连接时,会重新从主数据库备份一遍数据,比较费时
- Redis2.8实现增量数据传输,当从数据库重新连接时,主数据只需要发送断开期间的命令即可.
哨兵
功能
- 监控主数据库和从数据库是否正常运行
- 主数据库出现故障时自动将从数据库转换为主数据库
配置
哨兵会通过一下配置来找出需要监控的数据:
sentinel monitor master-name ip redis-post quorum
- master-name是主数据库的名字 由大小写字母、数字和".-_"组成. 可以通过名字获取主数据库的ip和端口
- ip是主数据库的ip地址
- redis-post 端口号
- quorum表示执行故障恢复操作前至少需要几个哨兵节点的同意
原理
每个哨兵会进行一下操作监控数据库:
- 每10秒哨兵会向主数据库和从数据库发送INFO命令
- 每2秒哨兵会像主数据库和从数据库的__sentinel__:hello频道发送自己的信息
- 每1秒向主数据库、从数据库和其他哨兵发送PING命令
发送INFO命令可以获取当前数据库的相关信息,从而实现新节点的自动发现.
sentinel:hello频道发送信息是用来哨兵与哨兵之间的交流,如果新增哨兵就建立一条新连接,哨兵与哨兵之间只发送PING命令
发送PING命令用来监控数据库和节点有没有停止服务,如果被PING的数据库或节点在一定时间内没有回复,那么哨兵就认定为主观下线,下来会去询问其他哨兵信息,如果超过一定数量的哨兵都认为主观下线,那么这个数据库或节点就被认为是客观下线,并选举领头的哨兵节点对主从系统发起故障恢复.