redis 基本
hash、list、set、sorted set,可存储2^32-1个元素
string长度为512m字节,即2^(9+10+10+3)=2^32
优点:速度快,数据类型多,可持久化,支持主从备份,水平扩展
快的原因:c语言开发 纯内存操作 单进程单线程 epoll多路复用 高效的数据结构
每次传输的数据量小网络不会堵塞
lua脚本可以实现更强大的功能,例如判断库存大于0的时候才减1
用途:
String:缓存、分布式锁、计数器等。
List:队列、链表、微博关注人时间轴列表等。
Hash:用户信息、Hash 表等。
Set:去重、赞、踩、共同好友等。
Zset:排行榜
HyperLogLog:统计总数
布隆过滤器:判断是否存在
Session共享(单点登录)
发布/订阅
简单的分布式锁:set k uuid nx px 100 当k不存在时,把k设为uuid,100毫秒过期
锁用完了要 del k,为防止del前线程挂掉,要设置过期时间
expire命令执行前可能宕机或重启,形成永久的锁。所以用set的px参数更好
当前线程A未执行完锁a可能就过期了,然后线程B加了锁b,线程A执行完会删掉锁B,
解决办法是把v设为随机数或者uuid,删的时候只删自己加的锁,这样不会删其他线程的锁,但会出现多个线程同时运行的情况,为避免这种情况,可以开个线程定时检测锁是否存在,如果存在就增加过期时间,这样的话,可能原本线程删锁的同时,新线程恰好增加锁的过期时间,导致删锁失败。
更好的办法是用lua实现原子性
主从架构,可能刚加完锁,还没同步,主就挂了,从变成了新主,另一个线程在新主里加锁成功
exists k key是否存在
keys p 查找所有符合模式p的key
randomKey 随机返回一个key
rename k1 k2 将k1改名为k2
renameNx k1 k2 k2不存在时,将k1改名为k2
del k 删除key
type k 返回k所存储值的类型
dump k 返回序列化的值
move k db 把当前数据库中的key移到数据库db中
expire k s 过期时间设为s秒后
pExpire k m 过期时间设为m毫秒后
expireAt k t 过期时间设为t,t是时间戳
pExpireAt k mt 过期时间设为mt,mt是毫秒时间戳
ttl k 返回剩余的时间(秒) ,time to live
pttl k 返回剩余的时间(毫秒)
persist k 移除k的过期时间,k将永久保存
设置密码:config set requirepass 123456
提供密码:auth 123456
Pipeline:插入大数据量时,将多次请求合并为一次,减少请求往返时间。
前提是多次请求之间不能有因果关系。
info命令:查看redis状态
config set/get:运行时修改/获取配置项