一 介绍
1. redis介绍(redis安装在磁盘,redsi数据存储在内存)
服务器交互
2. Redis是一种基于键值对(key-value)数据库,其中value可以为string. hash. List. Set. Zset 等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能。
3. 流水线:redis的流水线功能允许客户端一次将多个命令请求发送服务器,并将被执行的多个命令请求的结果在一个命令回复中全部返回客户端,使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。
二 特性:
1. 速度快,数据放在内存中,官方给出的读写性能10万/s,与机器性能也有关系:
A) 数据放内存中是速度快的主要原因
B) C语音实现,与操作系统距离近
C) 使用了单线程,预防多线程可能产生的竞争问题
2. 键值对的数据结构服务器
3. 丰富的功能
4. 简单稳定,单线程
5. 持久化,发生断电或机器故障,数据可能会丢失,持久化到硬盘
6. 主从复制,实现多个相同数据的redis副本
7. 高可用和分布式,哨兵机制实现高可用,保证redis节点故障发现和自动转移
三 使用场景:
1. 缓存: 合理使用缓存加快数据访问速度,降低后端数据源压力
2. 排行榜: 按照热度排名,按照发布时间排名,主要用到列表和有序集合
3. 计数器应用:视频网站播放次数,网站浏览次数,使用redis计数
4. 社交网站:赞,踩,粉丝,下拉,刷新
5. 消息队列: 发布和订阅
四 正确安装和使用
1. Linux上安装,windows安装
2. 配置,启动,操作,关闭
可执行文件
作用
Redis-service
启动redis
Redis-cli
Redsi命令客户端
Redis-benchmark
基准测试工具
Redis-check-aof
AOF持久化文件检测和修复工具
Redis-check-dump
RDB持久化文件检测和修复工具
Redis-sentinel
启动哨兵
3. redis-service 启动:
1. 默认配置: redis-service,日志输出版本信息,端口6379
2. 运行启动: redis-service
3. 配置文件启动: redis-service /opt/redis/redis.conf,灵活,生产环境使用
4. Redis-cli启动:
1) 交互式: redis-cli -h(host) -p(port) 链接到redis服务,没有h默认链接127.0.0.1
2) 命令式: redis-cli get hello //取key=hello的value
3) 停止使用: redis服务 redis-cli shutdown
注意:
A:关闭时,断开链接,持久化文件生成
B:还可以用kill关闭,此方法不会做持久化,还会造成缓冲区非法关闭,可能会造成AOF和数据丢失
4) 重大版本:
1. 版本号第二位为奇数,为非稳定版本
2. 第二位为偶数,为稳定版本
3. 当前奇数版本是下一个稳定版本的开发版本(如2.9版本是3.0版本的开发版本)
五 redis的API应用:
1. redsi 基本通讯模型
例子: 三个客户端同时执行命令
客户端1: set name test
客户端2: incr num
客户端3: incr num
指令
执行过程: 发送指令->执行指令->返回结果
执行命令: 单线程执行,所有命令进入队列,按照顺序执行,使用I/O多路复用解决问题
单线程快的原因: 纯内存访问,非阻塞I/O,单线程避免线程切换和竞争产生资源消耗
2. 数据结构(string)
1. 字符串类型: 实际上可以是字符串(包含xml json),还有数字,二进制,最大不能超过512MB
2. 设值命令: set age 23 ex 10 //10秒后过期
3. 获取命令: get age //存在返回value 不存在返回nil
4. 批量设值: mset country
5. 批量获取mget country
6. 若没有mget命令,则要执行N次get 命令
交互
7. 使用mget=1次网络请求加redis内部N次查询
N次查询
8. 计数: incr age //必须为整数增加1,非整数返回错误,无age键从0自增返回1
decr age //整数age减1
Incrby age 2//整数age +2
Decrby age 2 //整数 age -2
Incrbyfloat score 1.1 //浮点型 score+1.1
9. append 追加命令: set name hello append name world //追加后成 helloworld
10. 字符串长度: set hello “中航”:strlen hello// 结果6, 每个中文站3个字节
11. 截取字符串: set name helloworld:getranget name 24// 返回llo
3 数据结构 --哈希 hash
1. 是一个string 类型的 filed 和 value 的映射表,hash特适合用于存储对象
hash
以上图片命令分别为:
Set user:1:name name
Set user:1:age 19
可以发现,用字符串类型可以存储,但会过多占用key,浪费内存。
可以使用hash类型存储: hmset user:1 name name age 19。
2.命令: hset key field value
设值: hset usetr:1name name //成功返回1失败0
取值: hget user:1 name //返回name
删值: hdel user:1 age
计算个数: hset user:1 name name;hset user:1 AGE 23; hlen user:1 //返回2 user:1有两个属性值
批量设值: hmset user:2 name name age 20 sex boy
批量取值: hmget user:2 name age sex
判断field是否存在:hexists user:2 name //若存在返回1不存在返回0
获取所有的field: hkeys user:2
获取user:2所有的value: hvals user:2
获取user:2 所有field与value: hgetall user:2 //name age sex name 19 boy
增加1: hincrby user:2 age 1 //age+1
Hincrbyfloat user:2 age 2//浮点型加2
3. 应用场景
hash应用场景
Hash类型是稀疏,每个键可以有不同的field,若用redis 模拟做关系复杂查询开发困难,维护成本高
4. 三种方案实现用户信息存储优缺点:
1) 原生: set user:1 name name
Set user:1 age 19
优点: 简单直观,每个键对应一个值
缺点: 键数过多,占用内存多,用户信息过于分散,不用于生成环境
2) 将对象序列化存入reds
Set user:1 serialize(user)
优点: 编程简单,使用合理可减少内存空间消耗
缺点: 要控制ziplist与hashtable 两种编码转换,且hashtable会消耗更多内存
总结: 对于更新不多的情况下,可以使用序列化,对于value值大于64字节可以使用hash类型
4数据结构-列表(list)
1. 用来存储多个有序的字符串,一个列表最多可以存2的32次方减1个元素
存储
因为有序,可以通过索引下标获取元素或某个范围元素列表,列表元素可以重复
2. 列表命令:
常用命令
添加命令:
Rpush name cba //从右向左插入 cba 返回3
Lrange name 0-1 //从左道右获取列表所有元素 返回cba
Lpush key c b a //从左向右插入cba
Linsert name before b teacher //在b之前插入teacher,after为之后,使用lrange name 0-1 查看:c teacher b a
查找命令:
Lrange key start end //索引下标特点: 从左道右为0到N-1
Lindex name -1 //返回最右末尾a,-2返回b
Lien name //返回当前列表长度
Lpop name //把最左边的第一个元素c删除
Rpop name //把最右边的元素a删除
5. 数据结构-集合
1. 保存多元素,与列表不一样的是不允许有重复元素,且集合是无序的,一个集合最多可以存2的32方减1个元素,除了支持增删改查,还支持集合交集,并集,差集
set集合
2. 命令:
Exists user //检查user键是否存在
Sadd user a b c //向user 插入3个元素返回3
Sadd user a b //若在插入相同元素则会重复无效返回0
Smenmber user// 获取user 的所有元素,返回结果无序
Srem user a //返回1,删除a元素
Scard user // 返回2,计算元素个数
Sismember user a //判断元素是否在集合存在,存在返回1,不存在0
Sranmember user 2//随机返回2个元素,2为元素个数
Spop user 2 //随机返回2个元素a b 并将 a b 从集合中删除
集合交集:
Sadd user:1 name 24 boy
Sadd user:2 name 24 girl //初始化两个集合
Sinter user:1 user:2 //求集合交集 返回24
3. 使用场景
标签,社交,查询,智能推荐
6. 数据类型-有序集合
1. 与集合有联系,不能重复的成员
集合关系
2. 与list set 对比
set对比
3. 命令:
Zadd key score member [.....]
Zadd user:name 200 name //name的点赞数1,返回操作成功的条数1
Zadd user: name 200 name 120 mike 100 lee //返回3
Zadd test:1 nx 100 name //键test:1 必须不存在 主要用于添加
Zrange test:1 0-1 withscores //查看点赞与成员名
Zcard test:1 //计数成员个数返回1
查看点赞数:
Zadd test:2 nx 100 name //新增一个集合
Zscore test:2 name //查找name的点赞数返回100
7. 全局命令
1. 查看所有键: keys *, set school enjoy, set hello world
2. 键总数: dbsize
3. 检查键是否存在: exists key //存在返回1,不存在返回0
4. 删除键: del key
5. 键过期: expire key seconds // set name test expire name 10 //10秒过期
6. 键的数据结构类型: type key
8. 键的遍历
Redis 提供了两个命令来遍历所有的键
1. 键全量遍历
Mset country china city bj name name //设置3个字符串键值对
Keys * //返回所有的键 *匹配任意字符串多个字符
Keys *y //以结尾的键
Keys n*e //以n开头以e结尾返回name
Keys n?m //?号代表只匹配一个字符,返回name 全局匹配
Keys n?m* //返回name
Keys [j,i]* //返回以j l 开头的所有键
9. 渐进式遍历
Mset a a b b //初始化26个字母键值对
字符串类型:
SCAN命令用于迭代当前数据库中的数据库
返回结果为: 用于下一次迭代的新的游标4096:所有被迭代的元素如果数据集合不是以哈希表做为底层实现的话,则sacn类命令无视count 选项,直接返回数据集合的所有元素
Scan 0 match n*//匹配以n开头的键,最大是取10条第一条scan 0开始
六 redis数据库管理
1. select 0//共16个库 0--15 select 切换数据库
2. Set name name
3. Select 1
4. Get name //隔离了,取不到,和mysql不同库一样
其中redis3.0以后的版本慢慢弱化了这个功能,如在redis cluster 中只允许0数据库
原因:
1) redis 单线程,如果多个库,这些库使用同一个cpu 彼此会有影响
2) 多数据库,调试与运维麻烦,若有一个慢查询,会影响其他可以查询速度
3) 来回切换,容易混乱
Flushdb: 只清空当前数据库的键值对 dbsize 0
Flushall: 清空所有库的键值对