一、简介
1. Redis(Remote Directory Server)是一种基于key-value的NoSql内存数据库,使用C语言开发
2. 创建单实例数据库:下载、编译、安装、配置
http://www.cnblogs.com/yjmyzz/p/4105056.html
二、连接数据库
1. Windows,使用RedisDesktopManager软件
2. Linux连接线上redis数据库
a. ssh 到redis跳板机
b. redis-cli -h 127.0.0.1 -p 30006 连接集群的一台机器sentinal
-h <hostname> Server hostname (default: 127.0.0.1)
-p <port> Server port (default: 6379)
c. 在集群的一台机器上info 查询master服务器
d. 返回到redis跳板机,根据数据库名称进入真正的redis master服务器查询
redis-cli -h 127.0.0.1
select 5 // 选择第几个数据库
e. 输入密码登录:auth password
三、存储的数据类型:
1. 字符串<String>,命令:set/get/del key,最大容量是512M
2. 哈希hash,命令:hset/hget/hdel key field
3. 列表/队列<list>,命令:lpush/rpop
4. 无序集合set,没有重复数据,命令:sadd/smembers key
5. 有序集合zset,命令:zadd
四、redis命令
1. redis命令都是原子性的
2. keys:找到指定格式的key列表,但是阻塞,性能不好,不推荐使用
3. scan:无阻塞找到指定格式的key列表,但是有重复元素,如果数据量大,必须使用scan
4. 管道pipeline:将多次IO操作缩减为1次
五、为什么存取速度快
1. 使用C语言开发
2. 纯内存访问
3. 单线程,没有线程切换带来的性能开销
4. 非阻塞多路IO复用机制
5. 每秒10万次读写操作
六、redis事务
1. redis事务的本质是一组命令的集合,一次性执行这个集合,即使用pipeline
2. 正常流程:multi->redis命令(此时命令加入了队列,并没有执行)->exec/discard
3. redis事务不保证原子性,如果编译时失败,所有命令不会被执行;如果某条命令运行失败,后面的正确的语句仍然会被被执行
4. watch命令,监控key,在开启事务后,如果key被其他线程修改,则事务执行失败;watch类似于乐观锁
5. 使用lua脚本可以保证原子性
七、redis过期策略
1. redis在内存里,如果写入的数据太多,会自动清除一部分数据
2. 定期删除:每隔100ms随机抽取一部分key,检查是否过期,过期就删除;不能检查全部,否则性能不好
3. 惰性删除:获取key的时候,检查是否过期,过期就删除
4. 定期删除+惰性删除还是会有漏掉的过期key
八、内存数据淘汰机制:当内存不足时,redis会删除一些key
1. 禁止淘汰数据
2. 随机回收
3. 最近最少使用
4. 删除更早过期时间的key
九、使用场景
1. 普通缓存
2. 会话缓存:存储多台应用服务器的会话信息
3. 查找表
4. 队列
5. 计数器:对String进行自增自减运算
6. 发布/订阅
7. 共同好友:set的交集、并集操作
8. 排行榜:zset的有序操作
参考:
https://www.cnblogs.com/leeSmall/p/8344955.html
https://www.cnblogs.com/DeepInThought/p/10720132.html