Redis学习笔记
Redis介绍
1、一次只执行一条命令
2、不要执行长命令,如Keys、flushall、flushdb、slow lua script、mutil/exec、operate、big value(collection)
3、不是单线程
fysnc file descriptor
close file descriptor
单线程:
1、纯内存,数据都放在内存中
2、非阻塞IO
3、避免了线程切换和竞态消耗
Redis API
通用命令
keys
- keys * :列出所有key
- keys [pattern]:
一般不在生产环境使用,因为key会比较多,而redis是单线程的,时间复杂度是O(N);
dbsize
计算key的总数,时间复杂度是O(1),因为redis内置了计数器去记录Key的总数;
exists key
指定的key是否存在,存在返回1,不存在返回0;时间复杂度为O(1);
del key [key …]
删除指定的key-value;成功删除返回1,否则返回0;
expire key seconds
key在seconds秒后过期;
ttl key:查看key剩余的过期时间;返回-1代表key存在且没有过期时间;
persist key:去掉key的过期时间,让key成为不过期的key;
type key
返回key的类型;
常见命令的复杂度
上面提到的命令,但是没有列出来的,其时间复杂度都是O(1);
数据结构和内部实现
Redis数据结构
字符串
key是字符串,但是
最大是512MB,
缓存、计数器、分布式锁
get key:获取key对应的value,O(1);
set key value:设置key-value;
del key:删除key-value;
incr key:key自增1,如果key不存在,自增后get(key)=1,O(1)
der key:key自减1,如果key不存在,自增后get(key)=-1,O(1)
incrby key k:key自增k,如果key不存在,自增后get(key)=k,O(1)
decr key k:key自减k,如果key不存在,自减后get(key)=-k,O(1)
set key value:不管Key是否存在,都设置
setnx key value:Key不存在,才设置
set key value xx:key存在,才设置
mget:批量获取key,原子操作,节省了网络开销
mset:批量设置value,原子操作
应用
记录用户主页的访问量
incr userid:pageview(单线程,无竞争)
分布式id生成器
哈希(Hash)
结构
API
列表
Java客户端Jedis
Jedis使用
Jedis连接优化
Redis的其它功能
慢查询
声明周期
两个配置
配置方法
三个命令
Pipeline
Java实现
发布订阅
消息队列