Redis简介
哪些公司在使用Redis?
github twitter stackoverflow albaba baidu weibo 等等公司
redis的特性
1.速度快
2.持久化
3.多种数据结构
4.多种编辑语言
5.功能丰富
6.简单
7.主从复制
8.高可用,分布式
特性1 -速度快
数据存在内存,用c语言写的 5000行代码写的,单线程,
速度快慢 register>L1cache>L2cache>main menory>local Disk>Remote Disk
特性2 - 持久化(断电不丢数据)
redis将数据保存在内存种,对数据的更新将异步的保存在磁盘上
特性3 -数据结构
1.string/bitmaps/Blobs 2.hash tables 3.linkedLists 4. set 5.sroted Sets
还有新的数据结构:
bitMaps : 位图 本质 String
HyperLogLog: 嘲笑内存唯一值 计数 本质 String
GEO :地理信息定位 本质
特性4 -支持多种客户端语言
java php ruby lua python node.js 等等
特性5 -功能丰富
发布订阅 lua脚本 事务功能 pipeline 等等
特性6 -“简单”
23000行 c语言组成 不依赖外部库 单线程模型
特性7 -主从复制
特性8 -高可用,分布式
高可用 >> redis-Sentinel(v2.8)支持高可用
分布式 >> redis-Cluster(V3.0)支持分布式
Redis 典型应用场景
缓存系统 计数器 消息队列 排行榜 社交网络 实时系统
redis 三种启动方法
最简启动 配置文件启动 动态参数启动
redis 常用配置
daemonize 是否是守护进程 no|yes
port redis 对外端口号 默认端口:6379
logfile redis系统日志
dir redis 工作目录
等等很多配置。。。。
redis 通用命令
1.通用命令 2.数据结构和内部编码 3. 单线程架构
1.通用命令
keys 命令 一般不再生产环境使用
keys :遍历所有的key 例如:keys he*
dbsize : 计算key的总数
exists key:检查key是否存在 存在返回1 不存在返回0
del key:删除指定的key-value 重复删除返回1 不存在返回0
expire key seconds: key在seconds秒后过期
ttl key: 查看key剩余的过期时间
persist key: 去掉key的过期时间
type: 返回key的类型
时间复杂度
keys o(n)
dbsize o(1)
del o(1)
exists o(1)
expire o(1)
type o(1)
单线程
单线程为什么这么快?
1.纯内存 内存响应速度快 2. 非阻塞IO 3.避免线程切换和竞态消耗
单线程需要注意什么?
1.一次只运行一条命令 2. 拒绝长(慢)命令 3.其实不是单线程
Redis API的使用和理解
redis的数据结构
字符串
字符串类型应用场景: 缓存 计数器 分布式锁 等等。
(get set del) key 命令 incr , decr, incrby,decrby
incr key: key自增1 如果key不存在 自增后 get(key)=1
decr key: key自减1 如果key不存在 自减后 get(key)=-1
incrby key k: key 自增k,如果不存在,自增后get(key)=k
decrby ket k:key自减k 如果key不存在 自减后 get(key)=-k
实现如下功能:
记录网站每个用户个人主页的访问量?
incr userid:pageview(单线程:无竞争)
缓存视频的基本信息(数据源在mysql中)伪代码?
public VideoInfo get(long id){
String redisKey = redisPrefix +id;
VideoInfo videoInfo = redis.get(redisKey);
if(videoInfo == null){
videoInfo = mysql.get(id);
if(videoInfo!==null){
//序列化
redis.set(redisKey.serialize(VideoInfo));
}
return videoInfo;
}
set setnx setxx 命令
set key value: 不管key是否存在,都设置 o(1)
setnx key value: key不存在,才设置 o(1)
setxx key value: key存在,才设置 o(1)
mget mset 命令
mget key1 key2 key3 :批量获取key,原子操作 o(n)
mset key1 key2 key3: 批量设置 key-value o(n)
getset append strlen 命令
getset key newvalue : set key newvalue 并返回旧的value o(1)
append key value: 将value追加到 旧的value上 o(1)
strlen key: 返回字符串的长度(注意中文) o(1)
incrbyfloat getrange setrange 命令
incrbyfloat key 3.5: 增加key对应的值 3.5 o(1)
getrange key start end:获取字符串指定下标所有的值 o(1)
setrange key index value : 设置指定下标所有的值 o(1)
哈希 hash
哈希键值结构 Mapmap结构 field 不能相同 value 可以相同
key fileld value
user:1:info name chj
age 21
hget hset hdel 命令
hget key field :获取hash key对应的field的value o(1)
hget key field :设置hash key对应的field的value o(1)
hget key field :删除hash key对应的field的value o(1)
hexists hlen 命令
hexists key field: 普安段hash key是否有field o(1)
hlen key: 获取hash key field 的数量 o(1)
hmget hmset 命令
hmget key field1 field ... field:批量获取hash key的一批field对应的值 o(n)
hmset key field1 field ... field : 批量设置hash key的一批field对应的值 o(n)
列表 list key-elements
特点:有序 可以重复 左右两边可以插入弹出
重要API:
增: rpush lpush linsert 命令
rpush key value1 value2 ... valueN: 从列表右端插入值(1...N) O(1~N)
lpush key value1 value2 ... valueN: 从列表左端插入值(1...N) O(1~N)
linsert key before|after value newvalue: 在list指定的值前 | 后 插入newvalue O(N)
删: lpop rpop lrem ltrim 命令
lpop key:从列表左侧弹出一个item O(1)
rpop key: 从列表右侧弹出一个item O(1)
lrem key count value:根据count值,从列表中删除所有value相等的项 O(N)
(1)count >0 从左向右 删除最多count个value相等的项
(2)count <0 从右向左 删除最多Math.abs(count) 个value相等的项
(1)count =0 删除所有value相等的项
ltrim key start end: 按照索引范围修剪列表 ltrim listkey 1 4 就是删除1 4范围外的项
查: lrange lindex llen
lrange key start end(包含end):获取列表指定索引范围所有item O(N)
lindex key index:获取列表指定索引的item O(N)
llen key :获取列表长度 O(1)
改: lset
lset key index newvalue:设置列表指定索引值为newvalue O(N)
blpop brpop 命令
blpop key timeout: lpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞 O(1)
brpop key timeout: rpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞 O(1)
TIPS
1. LRUSH+LPOP=Stack 栈
2. LPUSH+RPOP - Queue 队列
3. LPUSH+LTRIM = Capped Collection 固定数量列表
4. LPUSH+BRPOP=MEssage Queue 消息队列
set 集合
特点:无序 无重复 集合间操作
集合内API:sadd srem scard sismember srandmember smembers
sadd key element: 向集合key添加element(如果element已经存在,添加失败) O(1)
srem key element : 将集合key中的element 移除掉 O(1)
scard user:1 follow = 4 :计算集合大小
sismember user:1 follow it = 1(存在) :判断it是否在集合中
srandmember user:1:follow count = his : 从集合中随机挑count个元素
smembers user:1:follow = music his sports it : 获取集合所有元素
smember : 无序 小心使用
srandmember 和spop:spop从集合弹出 srandmember不会破坏集合数据的 而且从集合中随机返回多个元素
set集合 实战-抽奖系统 赞 踩 等
集合见的API : sdiff sinter sunion
sdiff user:1:follow user:2follow = music his 差集
sinter user:1:follow user:2follow = it sports 交集
sunion user:1:follow user:2follow = it music his sports news ent 并集
sdiff | sinter | sunion + store destkey 将差集 交集 并集 结果保存在destkey中
集合见的实战: 例如 共同关注
tips:
SADD = tagging 标签相关
SPOP/SRANDMENBER = Random item 随机数
SADD+SINTER = Social Graph 社交相关的
Zset 有序集合
结构: key (score value)
特点: 无重复元素 有序 element+score
重要API: zadd zrem zscore zincrby zcard zrank zrange zrangebyscore zcount zremrangebyrank
zremrangebyscore
zadd key score element (可以是多对): 添加 score (可重复的)和element (不可重复的) O(logN)
zrem key element(可以是多个) : 删除元素 O(1)
zscore key element :返回元素的分数 O(1)
zincrby key increScore element:增加或减少元素的分数 zincrby user:1:ranking 9 chj (chj增加9分)O(1)
zcard key :返回元素的总个数 O(1)
zrank key element :获得排名 O(1)
zrange key start end [WITHSCORES] :返回指定索引范围内的升序元素 [ 分值 ] O(log(N)+m)
zrangebyscore key minScore maxScore [ WITHSCORES ] :返回指定分数范围内的升序元素 [分值] O(log(N)+m)
zcount key minScore maxScore:返回有序集合内在指定分数范围内的个数 O(log(N)+m)
zremrangebyrank key start end :删除指定排名内的升序元素 O(log(N)+m)
zremrangebyscore key minScore maxScore :删除指定分数内的升序元素 O(log(N)+m)
实战--排行榜
查缺补漏
zrevrank :指定元素的从高到低排名
zrevrange : 从高到低排名 取一定范围
zrevrangebyscore :给定一个分数 获取从高到低的结果
zinterstore :交集
zunionstore : 并集
有序集合总结
基本范围: zadd zrem zcard zincrby zscore
范围操作: zrange zrangebyscore zcount zremrangebyrank
集合操作: zunionstore zinterstore
学习总结:通过慕课网学习 并总结!
可参考这个博主,这个博主总结的很详细:https://www.jianshu.com/p/bd0c2dc95a17
网友评论