Redis初识&API的理解和使用
1. 初识Redis
1.1 开始
开源
Key-Value存储服务器
多种数据结构
速度快,功能丰富
1.2 特性
速度快
- 数据存在内存(主要原因)
- 使用c语言
- 线程模型为 单线程
持久化:数据将异步的保存在磁盘当中
数据结构:还有其它的几种衍生数据结构如下:
多语言客户端
功能丰富:
1. 发布订阅
2. lua脚本
3. 事务
4. pipeline
简单
- 单机版核心代码只有2.6w行
- 不依赖外部库
- . 单线程模型
主从复制
高可用分布式
1.3 典型使用场景
- 缓存系统
- 计数器
- 消息队列系统
- 排行榜
- 社交系统
- 实时系统
1.4 三种启动方式
简单启动:redis-server
动态参数:redis-server --port 6380
配置启动:redis-server configPath
启动后可以用客户端连接:redis-cli -h ip -p port
1.5 常用配置
daemonize : 是否是守护进程(nolyes)
port : Redis对外端口号
logfile: Redis系统日志
dir : Redis工作目录
2. API的理解和使用
2.1 通用命令
keys * #遍历所有key
del key [key…] #删除指定的key-value
dbsizee 算出key的总数
expire key seconds #key在sc秒后过期
ttl key #查看key剩余的过期时间(-1 代表没有过期时间 -2代表已过期)
persist key #去掉key的过期时间
exists key #检查一个key是否存在
type key #返回key的类型,结果为string hash list set zset none(key不存在)
2.2 数据结构和内部编码
2.3 redis的单线程
单线程为什么还这么快?
- 纯内存
- 非阻塞IO
- 避免线程切换和竞态消耗
其它注意点
- 一次只运行一条命令
- 拒绝长(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection) - 其实不是全是单线程,如下面的命令
fysnc file descriptor
close file descriptor
2.4 字符串
特点
key都为字符串 value可为 字符串(json) 整数 二进制
API
get key
#获取key对应的value
set key value
#设置key-value
del key
#删除key-value
incr key
#key自增1,如果key不存在,自增后get(key)=1
decr key o(1)
#key自减1,如果key不存在,自减后get(key)=-1
incrby key k
#Key自增k,如果key不存在自增后get(key)=k
decr key k
#Key自减k,如果key不存在,自减后get(key)=-k
set key value
#不管key是否存在,都设置
setnx key value
#key不存在,才设置
set key value xx
#key存在,才设置
注:以上命令 时间复杂度均为 o(1)
mget keyl key2 key3...
#批量获取key,原子操作
mset key1 valuel key2 value2 key3 value3
#批量设置key-value
注:以上命令 时间复杂度均为 o(n)
getset key newvalue
#set key newvalue并返回旧的value
append key value
#将value追加到旧的value(相当于字符串拼接)
strlen key
#返回字符串的长度(注意中文)
incrbyfloat key 3.5
#增加key对应的值3.5
getrange key start end
#获取字符串指定下标所有的值
setrange key index value
#设置指定下标所有对应的值
注:以上命令 时间复杂度均为 o(1)
实战
例一:实现如下功能:
缓存视频的基本信息(数据源在MySQL中)
伪代码如下:
例二:分布式id生成器
2.5 hash
特点
key还是String类型 ,值则分成 field和value,可以添加field来对属性进行扩充
redis本身就是一个map结构的,所以可以把这种数据结构理解成 “mapmap”,其中 field就像key一样不能相同 。
API
所有命令都是以h开头
hget key field
#获取hash key对应的field的value
hset key field value
#设置hash key对应field的value
hdel key field
#删除hash key对应field的value
hexists key field
#判断hash key是否有field
hlen key
#获取hash key field的数量
hsetnx key field value
#设置hash key对应field的value(如field已经存在,则失败)
hincrby key field intCounter
#hash key对应的field的value自增intCounter
hincrbyfloat key field floatCounter
#hincrby浮点数版
注:以上命令 时间复杂度均为 o(1)
hmget key field1 field2....fieldN
#批量获取hash key的一批field对应的值
hmset key fieldI valuel field2 value2..fieldN valueN
#批量设置hash key的一批field value
hgetall key
#返回hash key对应所有的field和value
hvals key
#返回hash key对应所有field的value
hkeys key
#返回hash key对应所有field
注:以上命令 时间复杂度均为 o(n)
实战
实现如下功能:
记录网站每个用户个人主页的访问量?
思路:hincrby user:1:info pageview count
实现如下功能:
缓存视频的基本信息(数据源在mysql中)伪代码
2.6 list
列表结构
同时还可以删除指定索引元素,获取子列表,获取指定索引下的元素
特点
有序
可以重复
左右两边插入弹出
API
增加
rpush key valuel value2...valueN
#从列表右端插入值(1-N个)
lpush key valuel value2...valueN
#从列表左端插入值(1-N个)
插入
linsert key beforelafter value newValue
#在list指定的值前|后插入newValue
删除
lpop key
#从列表左侧弹出一个item
rpop key
#从列表右侧弹出一个item
lrem key count value
#根据count值,从列表中删除所有value相等的项
(1)count>0,从左到右,删除最多count个value相等的项
(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3)count=0,删除所有value相等的项
ltrim key start end
#按照索引范围修剪列表
查询
lrange key start end(包含end)
#获取列表指定索引范围所有item
lindex key index
#获取列表指定索引的item
获取列表长度
llen key
#获取列表长度
改
lset key index newValue
#设置列表指定索引值为newValue
演示
实战
实战-TimeLine(微博关注的人更新)
查漏补缺
api blpop key timeout
#Ipop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
brpop key timeout
#rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
2.7 set
特点
集合结构
取出两个用户的共同,不同,和并集
特点如下:
无序
无重复
集合间操作
集合间API和实战
添加和删除
sadd key element
#向集合key添加element(如果element已经存在,添加失败)
srem key element
#将集合key中的element移除掉
scard user:1:follow=4#计算集合大小
sismember user:1:follow it=1(存在)#判断it是否在集合中
srandmember user:1:follow count=his#从集合中随机挑count个元素
spop user:1:follow=sports#从集合中随机弹出一个元素
smembers user:1:follow =music his sports it#获取集合所有元素
注:spop从集合弹出
srandmember不会破坏集合
演示
实战-标签(tag)
1.给用户添加标签
sadd user:1:tags tagl tag2tag5
sadd user:2:tags tag2 tag3 tag5
sadd user:k:tags tag1 tag2 tag4
2.给标签添加用户
sadd tagl:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
sadd tagk:users user:1 user:2
集合间API
sdiff user:1:follow user:2:follow=music his#差集
sinter user:1:follow user:2:follow =it sports#交集
sunion user:1:follow user:2:follow =it music his sports news ent#并集
sdifflsinterlsuion+store destkey..#将差集、交集、并集结果保存在destkey中
2.8 ZSET
特点
有序集合结构(右边是集合 左边是分值 可根据分值进行排序)
集合Vs有序集合
重要API
zadd key score element(可以是多对,复杂度为logN)
#添加score和element
zrem key element(可以是多个)
#删除元素
zscore key element
#返回元素的分数
zincrby key increScore element
#增加或减少元素的分数
zcard key
#返回元素的总个数
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)