Redis
Redis 出现背景
redis 的作者在开发一个网站 LLOOGG.com 的时候,开始想使用MySQL作为数据库来实现访问记录用户访问网站的记录,可能由于当时的机器不太好,他就开发了redis的第一个版本来实现这个功能。
Redis 是什么
redis 是开源的。基于键值对的一款 NOSQL 数据库。
Redis 特性回顾
* 速度快 (为什么快要知道) 官方给出每秒 10w 次 ops1·Q·(读写)
- 持久化 (持久化方式要了解)
- 多种数据结构(数据机构底层要了解)
- 支持多种编辑语言 (java,php,python等)
- 功能丰富 发布订阅 、事务、 lua 脚本 自定义功能、 pipline 提高并发
- 主从复制
- 简单 不依赖外部库、单线程模型。
- 高可用(redis-sentinel)、分布式(redis-cluster)
Redis 典型使用场景
- 缓存功能
- 计数器
微博转发数 评论数 - 消息队列 提供了发布订阅、阻塞队列
- 排行榜
- 社交网络
- 实时系统
Redis 常用配置说明
- daemonize
是否以守护进程的方式运行 - port
redis 对外暴露的端口号 - logfile
redis 系统日志 - dir
Redis 工作目录 :日志文件、持久化文件存在哪个目录
Redis 可执行文件
redis/src 下 ll | grep redis
redis-benchmarkredis 性能测试redis-aofaof 修复redis-dumprdb 修复redis -cliredis 客户端redis-serverredis 启动命令
Redis 启动
redis-server -p <指定端口>
redis-cli
使用配置文件启动
- 修改配置文件 daemonize 为yes 然后执行以下命令。
redis-server <配置文件>
Redis API 使用和理解
通用命令
除了 keys 都是 O(1)
- 删除一个键值对
del [key]如del k1true 1 false 0 - 查询键
keys [pattern]一般不在生产环境使用。会阻塞其他命令。 O(n)*匹配 0 ~ n 任意字符- [a-z] 单键查询范围
- ? 匹配一个任意字符
- key总数
dbsizeO(1) - key是否存在
exists key - 设置过期时间
expire key seconds# key 在 seconds 秒后过期 - 查询过期时间
ttl key-2 表示不存在了 -1 永不过期 - 去掉过期时间
persist key - key的数据类型
type key
字符串
-
场景
- 缓存
- 计数器
- 分布式锁
-
API
-
get
get key获取 value n次网络时间 + n 次命令时间 -
set
set key value设置 k 的值 为 v -
del
del key删除键值对 -
incr
incr key自增1 若key不存在返回 1 -
decr
decr key自减1 若key不存在返回-1 -
incrby
incryby key k增加k 若key 不存在 返回 k -
decryby
decrby key k减少k 若key 不存在 返回 -k -
set
set key valuekey存在不存在都进行设置 -
setnx
setnx key valuekey 不存在 才设置 相当于 add 操作 -
setex
setex key valuekey 存在 才设置 相当于 update 操作 -
mget
mget key1 key2 key3原子操作 -
mset
mset k1 v1 k2 v2原子操作省去 n 次网络时间 数量大了要节制哦 几十万就去拆分 呀不然n次get 也会使系统变慢 -
getset
getset key newValue设置新的值,返回旧的值。 -
append
append key value将value 拼接到旧得value 后面。 -
strlen
strlen key返回key 得长度** 中文要根据编码** O(1) -
getrange
getrange key start end获取 指定范围内得值 闭区间 -
setrange 设置指定下标所有对应的值
-
incrybyfloat 增加key 得值 浮点型
-
-
实战
-
记录每个用户个人主页的访问量(计数器)
- incr userid:pageview (单线程、没有竞争,可以保证计数的结果正确)。
-
缓存基本信息 (数据源在 MySQL中)提高接口访问性能和并发量。
- 缓存命中、直接返回。不存在、访问MySQL,回写到缓存,在返回信息给用户。伪代码如下
String key = ...result = redis.get(key)reuslt == null result = mysql.getInfo() result != null redis.set(key,info)return result
-
分布式id生成器,并发情况下使得id自增
- incr id(原子操作) 单线程 不会产生竞态条件。
-
Hash
-
特点
value=[{field1,value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象- 其中 filed 不可以相同,value 可以相同。
-
API
- hget 获取key 对应得 field 的value
hget key field - hset 设置 key 对应的 field 的value
hset key field value - hdel 删除对应key的field 的value
hdel key field - hexists 是否有field
- hlen 获取 hahs key filed 的数量
- hmget 一个key 一堆field 得到 一堆field 的value
- hmset 一个key 一堆 field 和 value
- hgetall 返回key 对应的所有field 和 value O(n)
- hvals 返回 key 对应的所有field 的value O(n)
- hkeys 返回 hash key 对应的所有field O(n)
- hget 获取key 对应得 field 的value
-
实战
- 记录每个用户个人主页的访问量(计数器)
- hincrby user:1:info pagevie count 用户属性是一个整体
- 缓存基本信息 (数据源在 MySQL中)提高接口访问性能和并发量。
- 思路与字符串相同,不同的是一个需要序列化和反序列化,而hash只需要进行transfor 将map 转为对象即可
- 编程稍微复杂,ttl不好控制。
- 记录每个用户个人主页的访问量(计数器)
list
-
特点
- 有序
- 可以重复
- 左右两边插入和弹出
-
API
-
rpush k1 v1 k2 v2 从列表右端插入值
-
lpush
-
lpop 从左边弹出一个元素
-
rpop 从右边弹出一个元素
-
blpop key timout 阻塞弹出 对于类似生产者消费者模型非常有帮助。
-
linsert key befor|after value new value 在 list 指定 的值 前|后 插入 newvalue
-
lrem key count value
- count = 0 所有与value 值相等的想
- count > 0 , 从左到右,删除最多 count 个 与value 相等的项
- count < 0 , 从右到左,删除最多 abs(count)个与 value 相等的项
-
ltrim key start end 保留链表 [start,end] 元素
-
查找
- lraange key start end 查 [staart,end] 所有元素
- lindex key index 查索引值 O(n)
- llen 获取列表长度
-
改
- lset key index value O(n)
-
-
实战
- 维护最新数据
- 类似栈,每次拿栈顶元素。
- 维护最新数据
-
总结
- LPUSH + LPOP = 栈
- LPUSH + RPOP = 队列
- LPUSH + LTRIM = 定长集合
- LPUSH + BRPOP = 消息队列
Set 集合
-
特点
- 不允许重复元素
- 无序
- 支持集合操作
-
API
- 交集操作 sinter k1 k2
- 差集操作 sdiff k1 k2
- 并集操作 sunion k1 k2
- 添加 sadd key element
- 删除 srem key element
- 计算集合大小 scard
- 集合元素是否存在 sismember key value
- 集合中随机挑选count 个元素 srandmember key count只是选,不会弹出
- 集合中随机弹出一个元素 spop 是会弹出的
- 集合中所有元素 smembers 无序 小心使用
- SUNIONSTORE destination key [key ...]
-
实战
- 抽奖系统 spop 或 使用 srandmember 取出count 个 在进行删除
- 赞、踩 ,一个用户只能赞一次或者踩一次
- 标签 :添加不同标签。
- 标签添加用户
- 共同关注:sinterstorge dest k1 k2
-
总结 SADD = 标签 SPOP/SRANDOMMEMBER = 随机/抽奖 SDD + SUNION = 社交圈/共同关注
有序集合
- API
ZADD KEY SCORE ELEMNTO(logn)ZREM KEY ELEMENTO(1)删除元素ZSCORE KEY ELEMENT获取分数ZINCRBY KEY SCORE ELEMENT给 element 增加分数ZCARD返回元素个数ZRANGE KEY START END [withscore]O(logn + m) 获取 [start,end] 范围内升序元素ZRANGEBYSCORE KEY minScore maxScoreO(logn + m)ZREMRANGEBYRANK key start end删除 排名 [start,end] 的元素ZREMRANGEBYScore key min max删出 [min.max] score 的元素ZREVRABK KEY倒数第几- 集合操作 zinterstore
- zunionstore
- 实战
- 排行榜
- zadd 依次增加。zrange 获取一定范围内的榜单。
- 排行榜