字符串
keys *
exists
del
type
get
set
incr key
incrby key n
decr
decrby
incrbyfloat 没有floatdecr,但是可以负数
append
strlen
mget key key…
mset key v k v …
getbit key n 从右到左第几位,0开始
setbit key n 0/1
bitcount key 1多少个
bitcount key start end 左右包含
bitop AND/OR/XOR outkey inkey1 inkey2
bitop NOT outkey inkey1
bitops key 0/1 右到左第一个0或1的索引,0开始
bitops key 0/1 start end
哈希
一个哈希key下有多个字段field
hgetall key 打印这个key下所有的field和value
hkeys key 只打印键下的所有field
hvals key 只打印键下的所有value
hget key field
hset key field value
hsetNx key field value 将hexists和hset合并,感觉一样
hmget key field field
hmset key field value field value
hexists key field field是否存在,0不存在,1存在 如要判断key本身是否存在则是exists
hexists key field value field不存在时赋值
hincrby key field value hash表某个field自增任意值
hdel key field field 删除多个field
列表(双向链表)
索引0开始是从左到右
索引-1开始是从又到左, -1代表最后一个,-2代表倒数第二个
lpush key val1 val2… 返回插入后的长度
rpush key val1 val2…
lpop key 返回结果是弹出的值
rpop key
brpop key1 key2… second
队列空就一直阻塞等待,传0表示一直等待,否则等待对应秒
等多个键,如果同时都有,从左到右优先级
llen key 长度
lrange key strat stop 打印某个区间内的所有值,左闭右闭,0 -1即打印整个表
ltrim key start stop 只保留区间内的元素,左闭右闭
lrem key count value
删除表中前count个值为value的元素,返回实际删除个数,
count为0时删除所有
为负数时从右边开始删
lindex key index 根据索引取值
lset key index value 根据索引设置值
linsert key before|after val1 val2 在val1之前或之后插入val2,从左到右找
rpoplpush srcKey destkey 将src最右边的元素移到dest左边,如果src==dest,则从队尾移到队首
集合(hash表)
smembers key 打印key里面的所有元素
scard key 元素数量
sadd key val1 val2… 插入元素,返回成功插入几个
srem key val1 val2… 删除元素,返回删了几个
sismember key val1 判断是否在集合中
vspop key 随机弹出一个
srandmember key [count] 随机返回一个,如果传了count,正数返回不相同的count个,负数返回|count|个可能相同的
sdiff key1 key2 key3 差
sinter key1 key2 key3 交
sunion key1 key2 key3 并
sdiffstore destkey key1 key2 key3 差,结果存到destkey
sinterstore destkey key1 key2 key3 交,结果存到destkey
sunionstore destkey key1 key2 key3 并,结果存到destkey
有序集合(hash+跳表)
每个成员都是[分数, 元素本身]的形式
多个分数相同的按编码排
插入元素相同,分数被更新
zcard key 元素个数
zcount key min max 分数范围内的元素个数
zadd key score member 插入分数和元素,可一次多组,分数值可以是+inf和-inf,表示正负无穷
zscore key member 获取某个元素的分数
zrank key member 元素排多少名
zrevrank key member 反向排名,需要注意:排名是从0开始的
zrem key member 根据元素名删
zremrangebyrank key start end 根据排名范围删
zremrangebyscore key min max根据分数范围删
zrange key start end [withscores] 返回范围内的元素,注意这里的strat和end是索引而不是分数值
withscores还会打印元素对应的分数值
zrevrange key start end [withscores] 这个是从大到小,前面的是从小到大
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
这个是根据分数值的返回返回元素,min max都包含
还可以:80 (100, 加括号表示不包含,也可以 80 +inf
limit是从第offset个开始的count个
zincrby key n/-n member 给某个成员增加减少分数
流
每流里面的每个元素可以包含多个键值对,并且只在末尾追加
xlen key 长度
xadd key [maxlen ~ n] id field1 val1 field2 val2
其中manxlen代表插入后保留n条最新的,不带是精确条数,带时条数模糊多一点,提高性能
id,可以自己写,也可以用星号代替,id的格式是[unix时间戳-这个时间戳的第几条],使用*时,该命令的返回值是id
xtrim key maxlen ~ n 同上
xrange key start end [COUNT count] 可以是xrange key - +来打印全部的内容
xrevrange key start end [COUNT count]
xdel key id 根据id删
事务
mulit // 表示开始一个事务
要执行的多条命令 // 命令发到服务器暂存
exec // 开始执行事务,对于每一行命令,都会返回一行对应的执行结果
遇到语法错误,因为可以提前发现,所有语句都不会执行
遇到运行错误,错误之前的已执行命令《不会》回滚
watch key
unwatch key
作用是监控某个key,如果key被修改,阻止接下来的事务执行
在比如说在执行mulit之后,exec之前,其他用户改了
过期时间
expire key second 时间是秒
ttl key 键还剩多少秒,已经过期的返回-2,没设置过期的返回-1
persist key 键设为永久,SET和GETSET命令也会导致键的过期时间被清除,恢复永久
键超时删除,watch<不会>认为其被改变
sort排序
sort key asc|desc 默认只能排全数字的集合
有序集合则会忽略分数字段,对值本身排
四个可选参数LIMIT、BY、GET、STORE
LIMIT off count 从第几个开始,打印几个
BY 不按值本身,二十根据另一个键中的字段排序,而且by后面的东西必须带星号
比如:sort key by num*
会把key中的每个值替换到星号,形成num1、num2…,然后去根据键num1、num2的值排序
另外如果是hash键,还会有hashkey*->field,取hash某个字段来比较排序
但是,星号必须要在->前面
GET get是返回哪些列,如果有多个get,每个元素就会对应返回多个列
如:GET hashkey*->title BY hashkey*->id
GET # 则代表元素本身
STORE 排序结果存到哪,同前
持久化
RDB:保存数据副本
需要在配置文件中写规则,save 300 1,表示300秒内修改10次就备份
SAVE:阻塞所有客户端命令保存快照
BGSAVE:异步保存,使用fork的子进程去写快照文件,而因为写时复制,子进程也不会导致内存翻倍
flushall,清空redis,如果配置文件有规则,才会写快照文件
AOF:保存执行的命令
命令文件过大时,会导致重写文件清除冗余命令
命令文件保存在操作系统的缓存中,何时写入硬盘基于:appendfsync always|everysec|no
分别是每个命令都重写|一秒一次|操作系统控制何时写入
主从
redis-server // 默认6379启动
redis-server -port 6380 --slaveof 127.0.0.1 6379 // 作为6379的从数据库启动
redis-cli // 默认进6379
redis-cli -p 6380 // 连指定服务器
命令:info replication 打印服务器西信息,地址,角色主从\之类的
哨兵
用来监控主从,当主库进程死掉,推选从库提升到主库
sudo apt-get install redis-server
sudo apt-get install redis-sentinel
安装后会自动运行对应实例,并且kill命令杀死后会重启,停止方法是:
sudo /etc/init.d/redis-server stop
sudo /etc/init.d/redis-sentinel stop
启动哨兵实例需要配置文件,配置文件中说明了监控哪个redis实例,以及实例消失掉多久后推选从库变为主库
一个哨兵可以监视多个哨兵和redis实例,一个redis实例也能被多个哨兵监视
1.首先启动一主二从的库:
redis-server
redis-server -port 6380 --slaveof 127.0.0.1 6379
redis-server -port 6381 --slaveof 127.0.0.1 6379
2.配置文件:名字.conf
sentinel monitor 随便起的一个名字 127.0.0.1 1 6379 1 # 1表示有多少个哨兵同意后才推选其成为主库
sentinel down-after-milliseconds 上一行起的名字 60000 # 主库消失多久后开始推选
# 配置文件只写主库的就可以了,哨兵连到主库后,会用info命令拿到从库的信息
3.启动哨兵
redis-sentinel 名字.conf
# 需要出现+slave等字段才说明监视成功
# 主库A消失后,从库B变成主库,A又出现,A是B的从库
# 配置文件不知道什么原因可能被哨兵还是redis实例修改,没具体了解,最好启动时从某处复制一份再启动
集群
键的分配:所有的键都会经过crc16求hash,然后求余16384得到一个槽id,所以一共有0-16383个槽
槽的分配:集群创建时,16384个槽,分配个每个节点,命令操作键,会先找键在哪个节点,然后去对应节点上找,
每个节点最好有一个从库,如果节点死掉,至少可以从从库恢复,而不导致键丢失
关于键的迁移就不写了
1.每个实例对应的配置文件中:cluster-enable yes,然后启动
2.创建集群:redis-cli --cluster create --cluster-replicas ip1:port1 ip2:port2 …
3.新增集群节点:cluster meet ip port