一、Redis入门
1.1 redis简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API其中value 可以为string、hash、list、set、zset 等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能
流水线
Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器,并将被执行的多个命令请求的结果在一个命令回复中全部返回给客户端,使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。
数据存放
1,Redis安装在磁盘;
2,Redis数据存储在内存
redis简单使用
比如说,数据库有一张表Order订单表, 表主键orderid
1.2 Redis特性
- 速度快,数据放在内存中,官方给出的读写性能10 万/S,与机器性能也有关
- 键值对的数据结构服务器
- 丰富的功能:见上功能
- 简单稳定:单线程
- 持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘
- 主从复制:实现多个相同数据的redis 副本
- 高可用和分布式:哨兵机制实现高可用,保证redis 节点故障发现和自动转移
- 客户端语言多:java php python c c++ nodejs 等
1.3 redis性能高性能原因
- 纯内存访问
- 非阻塞I/O(使用多路复用)
- 单线程避免线程切
1.3 redis使用场景
1,缓存:合理使用缓存加快数据访问速度,降低后端数据源压力
2,排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合
3,计数器应用:视频网站播放数,网站浏览数,使用redis 计数
4,社交网络:赞、踩、粉丝、下拉刷新
5,消息队列:发布和订阅
1.4 redis基本操作
可执行文件 |
作用 |
redis-server |
启动redis |
redis-cli |
redis命令行客户端 |
redis-benchmark |
基准测试工具 |
redis-check-aof |
AOF持久化文件检测和修复工具 |
redis-check-dump |
RDB持久化文件检测和修复工具 |
redis-sentinel |
启动哨兵 |
redis-trib |
cluster集群构建工具 |
二、Redis数据结构介绍
2.1 字符串
字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB
命令 | 备注 |
set age 23 ex 10 | 10秒后过期 px 10000 毫秒过期 |
setnx name test | 不存在键name时,返回1设置成功;存在的话失败0 |
set age 25 xx | 存在键age时,返回1成功 |
get age | 存在则返回value, 不存在返回nil |
set country china city beijing | 批量设值 |
mget country city address | 批量获取 |
注意:若没有mget命令,则要执行n次get命令
命令 | 备注 |
incr age | 必须为整数自加1,非整数返回错误,无age键从0自增返回1 |
decr age | 整数age减1 |
incrby age 2 | 整数age+2 |
decrby age 2 | 整数age -2 |
ncrbyfloat score 1.1 | 浮点型score+1.1 |
append name world | 追加指令 |
getrange name 2 4 | 截取字符串 |
2.2 哈希(Hash)
2.2.1 hash存储对象
redis得hash和JAVA的hash结构是一样的,我们可以将一些数据库的热点数据写入redis中。例如:
1,用户表数据如下:
2,存储到Redis, 使用字符串如何完成存储操作?
3,哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象
操作指令: hmset user:1 name Dk age 18
2.2.2 hash常用命令
命令 | 备注 |
hset key field value | hset user:1 name Dk//成功返回1,失败返回0 |
hget user:1 name | 取值 |
hdel user:1 age | 删只值 |
hlen user:1 | 计算个数 |
hmset user:2 name Dk age 23 sex boy | 批量设值 |
hmget user:2 name age sex | 批量取值 |
hexists user:2 name | 判断field是否存在 |
hkeys user:2 | 获取所有field |
hvals user:2 | 批量取值 |
hgetall user:2 | 获取user:2所有field与value |
hincrby user:2 age 1 | 增加1 |
hincrbyfloat user:2 age 2 | 增加2 浮点 |
2.2.3 hash对象存放优点
1,原生:set user:1:name Dk;
set user:1:age 23;
set user:1:sex boy;
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境
2,将对象序列化存入redis
set user:1 serialize(userInfo);
优点:编程简单,若使用序列化合理内存使用率高
缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis
3,使用hash类型:
hmset user:1 name Dk age 23 sex boy
优点:简单直观,使用合理可减少内存空间消耗
缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize(userInfo);
2.2.4 内部编码
hash的内部编码主要有ziplist<压缩列表>和hashtable<哈希表>两种,大家感兴趣的话后面可以单独个章节介绍下这两种数据结构
当field 个数少且没有大的value 时,内部编码为ziplist
如:hmset user:3 name Dk age 24; object encoding user:3 //返回ziplist
当value 大于64 字节,内部编码由ziplist 变成hashtable
如:hset user:4 address “fsgst64 字节”; object encoding user:3 //返回hashtable
2.3 列表<list>
2.3.1 list简介
用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素
因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复
2.3.2 list常用命令
命令 | 备注 |
rpush Dk c b a | 从右向左插入cba, 返回值3 |
lrange Dk 0 -1 | 从左到右获取列表所有元素 返回 c b a |
lpush key c b a | 从左向右插入cba |
linsert Dk before b teacher | 在b之前插入teacher, after为之后,使用lrange Dk 0 -1 查看 |
lrange key start end | 索引下标特点:从左到右为0到N-1 |
lindex Dk -1 | 返回最右末尾a,-2返回b |
llen Dk | 返回当前列表长度 |
lpop Dk | 把最左边的第一个元素c删除 |
rpop Dk | 把最右边的元素a删除 |
2.4 集合<set>
2.4.1 集合应用场景
用户标签,社交,查询有共同兴趣爱好的人,智能推荐
保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;
2.4.2 set命令:
命令 | 备注 |
exists user | 检查user键值是否存在 |
sadd user a b c | 向user插入3个元素,返回3 |
sadd user a b | 若再加入相同的元素,则重复无效,返回0 |
smember user | 获取user的所有元素,返回结果无序 |
srem user a | 返回1,删除a元素 |
scard user | 返回2,计算元素个数 |
2.4.3 使用示例
当我们要根据用户标签筛选有同兴趣爱好的人,实现智能推荐,可以按照这种方式进行计算
1、给用户添加标签:
sadd user:1:fav basball fball pq
sadd user:2:fav basball fball
............
2、或者标签添加用户
sadd basball:users user:1 user:2
sadd fball:users user:1 user:2
.......
3、计算出共同感兴趣的人:
sinter user:1:fav user2:fav
2.5 有序集合(ZSET)
2.5.1 常用场景
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数。与集合有联系,不能有重复的成员
三、redis常用命令
3.1 常用命令
1,查看所有键:
keys * set school enjoy set hello world
keys *ool -----> school
2,键总数 :
dbsize //2个键,如果存在大量键,线上禁止使用此指令
3,检查键是否存在:
exists key //存在返回1,不存在返回0
4,键过期:
expire key seconds //set name test expire name 10,表示10秒过期
ttl key // 查看剩余的过期时间
5,键的数据结构类型:
type key //返回string,键不存在返回none
3.2 redis数据库管理
redis数据库管理方式 |
select 0 选择数据库 |
flushdb 清除数据库 |
flushall 清除所有数据 |
dbsize 数据大小 |
默认支持16个数据库;可以理解为一个命名空间
跟关系型数据库不一样的点
- redis不支持自定义数据库名词
- 每个数据库不能单独设置授权
- 每个数据库之间并不是完全隔离的。 可以通过flushall命令清空redis实例面的所有数据库中的数据
通过 select dbid 去选择不同的数据库命名空间 。 dbid的取值范围默认是0 -15