1.安装
sudo apt-get redis-server
redis-server
2.命令
string:
set key value get key
key不存在时增加 setnx key value 位操作 setbit key 位置1 0/1 位置2 0/1
统计为1的bit数 bitcount key start end
list:
lpush key e1 e2 lrange key start end lpop key lrem key count value
为lpop的阻塞版本,在列表中没有元素时会阻塞。blpop key timeout
只保留最近的start到end条记录。并且会按照插入时间排序。新的在前。ltrim key start end
hash:
hmset key f1 v1 f2 v2 hgetall key hget key fieldname 给对应的f1的v1增加1 hincrby key f1 v 获取长度 hlen key 删除key中一个field hdel key field
set:
sadd key v1 v2 smembers key 统计元素个数 scard key
查找是否存在 sismember key v 查找key1和key2的交集 sinter key1 key2
查找差集 sdiff key1 key2
zset:
zadd key c1 m1 c2 m2 z(rev)range (逆序) ranks start end (withscores) 加上会显示分数c
zrem key member zscore key member zcard key
显示类型 type key 直接删除 del key 显示所有key keys *
分布式锁
setnx lockname 1
set lockname 1 nx ex 30 设置30s后自动解锁
def lock
if (get(lockname) == 1)
def (lock);
事务操作
一种乐观锁,事务进行时其他进程修改key会导致事务失败
watch key
multi
具体事务
exec
Lua脚本
把脚本编译成代码,减少传输开销
优化
操作分布式锁
分布式
在副服务器设置其主服务器。
看主库和库的run id是否相同,如果相同,使用增量更新,每次更新一个offset量,否则使用全量更新
保证可用性:
哨兵模式
哨兵集群作用:
1.监听redis服务器是否宕机。
2.判断哪一个从redis的数据更新
3.把一个从redis作为主redis并且让其他从redis连接
4.将主redis更换的信息告诉client
开销很大,在必须保证主redis时使用。不能横向扩展,即不能增加结点。
redis cluster集群
多个结点同时提供服务,可以从任意一个结点进入集群。通过把增加数据的槽位保证数据均衡。
具体配置:
使用6个文件夹,代表6个端口,表示6个redis结点,不能再少了
第一个log改成logfile
代码有错/g
把7005作为7001的从结点。
面试问题
由于lua脚本如果有先set,后lpush,这时set会成功,push会失败,所以lua没有一致性。
为啥redis要用44字节来划分使用数据类型,比如字符串小于44的使用embstr,大于44字节使用raw编码:
前者为redis基本数据结构,后者为适用于字符串的高效存储,并且buf需要适配非安全字符串(有\0的),所有共需20字节。同时cache line为64字节,且sds存储为redis的存储方式。64-20=44.所以以44分割。
fork写时复制。相当于给进程的内存创建一个快照。
复制时会复制出子进程和页表,并把页表状态修改为只读状态,多个进程使用同一个物理页。
在任意一个进程修改数据时,会把物理页复制,并将对应的页表状态设置为可读可写状态。
持久化:
aof基于缓存,aofwrite基于内存,rdb基于内存。在redis.conf(redis源码)中配置。
rdb在断电时可能会有较多的数据丢失,因为rdb会在规定的时间间隔中创建快照,然后对快照使用保存,而aof在always时会一直保存,并且保存的是命令不是数据,所以文件大,损失少