一、redis概述
1、认识redis
Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库
特征:
- 键值(key-value)型,value支持多种不同数据结构,功能丰富
- 单线程,每个命令具备原子性
- 低延迟,速度快(基于内存、IO多路复用、良好的编码)
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
2、redis应用场景
- 热点数据的缓存: 作为缓存数据,缓存都是基于内存走
- 限时业务的运用: 秒杀 存放用户信息 短信保存
- 计数器相关问题: 点赞量 播放量 访问量
- 排行榜相关问题:
- 分布式锁: setnx()
- 利用set结构的无序性
3、认识Redis
数据结构 |
数据关联 |
查询方式 |
事务特性 |
存储方式 |
扩展性 |
|
SQL |
结构化(Structured) |
关联的(Relational) |
SQL查询 |
ACID |
磁盘 |
垂直 |
NoSQL |
非结构化 |
无关联的 |
非SQL |
BASE |
内存 |
水平 |
二、redis持久化存储
- RDB
Redis 默认开启RDB持久化方式,将内存中的数据写入到磁盘中
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1 数据的完整性和一致性不高;
2 备份时占用内存。
- AOF (append only file)
Redis 默认不开启,采用日志的形式来记录,并追加到文件中。
优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
2、redis操作
服务器端
①查看帮助⽂档
redis-server --help
客户端
①进入redis环境
redis-cli
②查看帮助⽂档
redis-cli --help
③测试是否连接正常
127.0.0.1:6379> ping
PONG
④切换数据库
127.0.0.1:6379> select 8
OK
127.0.0.1:6379[8]>
⑤关闭数据库
quit
三、redis的数据类型
1、redis的结构
redis是key-value的数据结构,每条数据都是⼀个键值对
- 键的类型是字符串
注意:键不能重复
- 值的类型主要分为五种:
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
string类型
String类型,字符串类型,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512M
常见命令:
①SET:添加或者修改已经存在的一个String类型的键值对
127.0.0.1:6379[8]> set name jack#name是键,jack是值 OK |
②GET:根据key获取String类型的value
127.0.0.1:6379[8]> get name#name是键,输出的结果是字符串 "jack" |
③MSET:批量添加多个String类型的键值对
127.0.0.1:6379[8]> mset lag1 py lag2 web #lag1是键1,py是值1,lag2是键2,web值2 OK |
④MGET:根据多个key获取多个String类型的value
127.0.0.1:6379[8]> mget lag1 lag2 #lag1是键1,lag2是键2 1) "py" 2) "web" |
⑤DEL:删除
127.0.0.1:6379[8]> del name #name是键 (integer) 1 127.0.0.1:6379[8]> get name (nil) 127.0.0.1:6379[8]> del lag1 lag2 #删除多个值,其实就是删的键 (integer) 2 |
⑥INCR:让一个整型的key的值自增1
127.0.0.1:6379[8]> set age 20 #默认值 OK 127.0.0.1:6379[8]> get age "20" 127.0.0.1:6379[8]> incr age#自增加了1 (integer) 21 |
⑦INCRBY:让一个整型的key的值自增并指定步长,例如:incrby num 2 让num值自增2
127.0.0.1:6379[8]> incrby age 10 #增长了10 (integer) 31 |
⑧DECR: 自减
127.0.0.1:6379[8]> decr age #自减1 (integer) 30 |
⑨DECRBY: 将 key 所储存的值减去指定的减量值
127.0.0.1:6379[8]> decrby age 10#自减了10 (integer) 20 |
⑩append:追加
127.0.0.1:6379[8]> append name wei #追加了wei (integer) 7 127.0.0.1:6379[8]> get name "jackwei" |
exists:判断键是否正确
127.0.0.1:6379[8]> exists age #返回1是正确的 (integer) 1 |
rename:重命名
127.0.0.1:6379[8]> rename age new #将age改名为new OK |
设置过期时间 expire key seconds
127.0.0.1:6379[8]> expire haha 10 #设置“haha”键10秒后过期 (integer) 1 |
k
PERSIST 命令用于移除指定 key 的过期时间 persist key
127.0.0.1:6379[8]> persist p1 #返回1,说明移除指定时间成功 (integer) 1 |
查看剩余过期 TTL key
127.0.0.1:6379[8]> ttl haha #还有3秒过期 (integer) 3 |
创建键的时候就设置过期时间 set key value ex seconds
127.0.0.1:6379[8]> set p2 111 ex 10 #创建的时候设置过期时间 OK |
2.list类型
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
常见命令:
①LPUSH key element ... :向列表左侧插入一个或多个元素
127.0.0.1:6379[8]> lpush lname g1 g2 g3#向左插入了键g1、g2、g3 (integer) 3 |
②LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
127.0.0.1:6379[8]> lrange lname 0 -1 1) "g5" 2) "g2" 3) "g1" 127.0.0.1:6379[8]> lpop lname#移除最左面的第一个元素 "g5" |
③RPUSH key element ... :向列表右侧插入一个或多个元素
127.0.0.1:6379[8]> rpush lname g4#向右插入了键g4 (integer) 4 |
④RPOP key:移除并返回列表右侧的第一个元素
127.0.0.1:6379[8]> lrange lname 0 -1 1) "y5" 2) "g5" 3) "g2" 4) "g1" 5) "g4" 127.0.0.1:6379[8]> rpop lname #移除最右面的第一个元素 "g4" |
⑤LRANGE key start end:返回一段角标范围内的所有元素
127.0.0.1:6379[8]> lrange lname 0 -1 #查看0到-1之间的值 1) "g3" 2) "g2" 3) "g1" 4) "g4" |
⑥type:查看类型
127.0.0.1:6379[8]> type lname #查看键lname是什么类型 list |
⑦linsert: 插入
127.0.0.1:6379[8]> linsert lname before g2 g5#在g2前面插入g5 (integer) 5 127.0.0.1:6379[8]> lrange lname 0 -1 1) "g3" 2) "g5" 3) "g2" 4) "g1" 5) "g4" |
⑧lindex:通过下标查值
127.0.0.1:6379[8]> lindex lname 0 #通过下标值0查看 "g3" |
⑨lset:修改对应索引的值
127.0.0.1:6379[8]> lset lname 0 y5#修改索引0的值为y5 OK 127.0.0.1:6379[8]> lrange lname 0 -1 1) "y5" 2) "g5" 3) "g2" 4) "g1" 5) "g4" |
⑩ltrim:删除以外的值
127.0.0.1:6379[8]> ltrim lname 1 -1#删除1到-1以外的值 OK 127.0.0.1:6379[8]> lrange lname 0 -1 1) "g5" 2) "g2" 3) "g1" |
3、hash类型
常见命令
①HSET key field value:添加或者修改hash类型key的field的值
127.0.0.1:6379[8]> hset hname name1 jack #hname键 name1键的类型 (integer) 1 127.0.0.1:6379[8]> keys * #查看所有的键 1) "hname" 2) "p1" 3) "new" 4) "lname" |
②HGET key field:获取一个hash类型key的field的值
127.0.0.1:6379[8]> hget hname name1 #查看hname name1值 "jack" |
③HMSET:批量添加多个hash类型key的field的值
127.0.0.1:6379[8]> hmset hage q1 1 a2 2 q3 3#批量添加hage的值 OK |
④HMGET:批量获取多个hash类型key的field的值
127.0.0.1:6379[8]> hmget hage q1 a2 q3 #显示hage下q1、a2、q3的所有值 1) "1" 2) "2" 3) "3" |
⑤HGETALL:获取一个hash类型的key中的所有的field和value
127.0.0.1:6379[8]> hgetall hage#将键和值都显示出来 1) "q1" 2) "1" 3) "a2" 4) "2" 5) "q3" 6) "3" |
⑥HKEYS:获取一个hash类型的key中的所有的field
127.0.0.1:6379[8]> hkeys hage #获取hage下的field 1) "q1" 2) "a2" 3) "q3" |
⑦HVALS:获取一个hash类型的key中的所有的value
127.0.0.1:6379[8]> hvals hage#查询键中所有的值 1) "1" 2) "2" 3) "3" |
⑧HINCRBY:让一个hash类型key的字段值自增并指定步长
127.0.0.1:6379[8]> hget hage a2 "2" 127.0.0.1:6379[8]> hincrby hage a2 3#在原有的基础上增了3个值 (integer) 5 |
⑨HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
127.0.0.1:6379[8]> hsetnx hage p1 qqq#有相同的键创建失败 (integer) 0 127.0.0.1:6379[8]> hsetnx hage a6 qqq #没有相同的键创建成功 (integer) 1 |
⑩hlen:查看键下的属性
127.0.0.1:6379[8]> hlen hage #查看hage下有三个属性 (integer) 3 |
4、set类型
Redis的Set结构特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常用命令
①添加数据: sadd key members
127.0.0.1:6379> sadd sname g1 g2 g3 #批量给键添加值 (integer) 3 |
②查看 :smembers key
127.0.0.1:6379> smembers sname #查看键中的值 1) "g3" 2) "g1" 3) "g2" |
③删除: spop key
127.0.0.1:6379> spop sname #随机删除键中指定的值 "g3" |
④srem key 删除指定元素
127.0.0.1:6379> srem sname g1 #删除指定键中指定的值 (integer) 1 |
⑤查看元素个数:scard sname
127.0.0.1:6379> scard sname #查看键个数 (integer) 1 |
5、zset类型
- sorted set,有序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
- 说明:没有修改操作
常用命令:
①
添加数据 zadd key score1 member1 score2 member2 ... |
②
查看指定范围数据 zrange key start stop |
③
返回score值在min和max之间的成员 zrangebyscore key min max |
④
返回成员member的score值 zscore key member |
⑤
查看键key包含的元素个数 zcard key |
⑥
删除指定元素 zrem key member1 member2 ... |
⑦
移除有序集中,指定排名(rank)区间内的所有成员 zremrangebyrank key start stop |
⑧
删除权重在指定范围的元素 zremrangebyscore key min max |