一、基础知识
-
16个数据库:DB0~DB15
-
默认使用DB 0,可以使用
select n
切换到DB n -
dbsize
可以查看当前数据库的大小,与key数量相关127.0.0.1:6379[15]> config get databases //命令行查看数据库数量databases 1) "databases" 2) "16" 127.0.0.1:6379[15]> select 15 //切换数据库DB 15 OK 127.0.0.1:6379[15]> dbsize //查看当前数据库大小,不同数据库之间的数据是不能互通的,并且dbsize是根据库中key的个数 (integer) 0
keys *
:查看当前数据库中所有的key(注意:查询到的是key,而不是value)。
flushdb
:清空当前数据库中的键值对。
flushall
:清空所有数据库中的键值对(DB0~DB15)。
127.0.0.1:6379[15]> set name czl
OK
127.0.0.1:6379[15]> set age 18
OK
127.0.0.1:6379[15]> keys *
1) "name"
2) "age"
127.0.0.1:6379[15]> select 0
OK
127.0.0.1:6379> keys * //在DB0中不能获得DB15中所记录的键值对
(empty array)
127.0.0.1:6379>
Redis是单线程的,是基于内存操作的
所以Redis的性能瓶颈不是CPU,而是机器内存和网络宽带。
那就出现一个问题,为什么Redis的速度这么快,性能这么高呢?QPS(每秒查询率)达到10W+ ?
Redis为什么单线程还这么快?
- 误区1:高性能的服务器一定是多线程的
- 误区2:多线程(CPU上下文会切换)一定比单线程效率高
核心:Redis是将所有数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(上下文会切换,就会有耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。
二、五大基本数据类型
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库、高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
Redis-key
在redis中无论什么数据类型,在数据库都是以key-value的形式保存的,通过进行Redis-key的操作,来完成数据库中数据的操作
下面学习的命令
exists key
:判断键是否存在del key
:删除键值对move key db
:将键值对移动到指定的数据库expire key second
:设置键值对的过期时间type key
:查看value的数据类型
127.0.0.1:6379> keys * //查看当前数据库所有的key
1) "name"
2) "age"
127.0.0.1:6379> set gender nan //设置一个gender-nan的键值对
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> move gender 1 //将key为gender的键值对移动到DB1数据库
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "gender"
127.0.0.1:6379[1]> del gender //删除key为gender的键值对
(integer) 1
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> EXISTS gender
(integer) 0 //存在则返回1,不存在则返回0
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> set gender nan
OK
127.0.0.1:6379> EXPIRE gender 15 //设置键值对的过期时间
(integer) 1
127.0.0.1:6379> ttl gender
(integer) 6
127.0.0.1:6379> ttl gender
(integer) 5
127.0.0.1:6379> ttl gender
(integer) 4
127.0.0.1:6379> ttl gender
(integer) 3
127.0.0.1:6379> ttl gender
(integer) 1
127.0.0.1:6379> ttl gender
(integer) 0
127.0.0.1:6379> ttl gender
(integer) -2
127.0.0.1:6379> get gender
(nil)
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> type name
string
127.0.0.1:6379> type age
string
关于TTL(ttl)
命令
Redis的key,通过TTL命令返回key的过期时间,一般来说有三种结果
- 当前key没有设置过期时间,则返回-1
- 当前key有设置过期时间,而且key已经过期,则返回-2
- 当前key有设置过期时间 ,并且key还没有过期,故会返回key的正常剩余时间。
关于重命名RENAME
和RENAMENX
RENAME key newkey
:修改key的名称RENAMENX key newkey
:仅当newkey不存在时,将key改名为newkey
127.0.0.1:6379> RENAME name name2 //将键值对中key为name的键值对的key修改成name2
OK
127.0.0.1:6379> keys *
1) "age"
2) "name2"
127.0.0.1:6379> RENAMENX name2 age//age存在所以不能将键值对key为name2的key修改成age
(integer) 0
127.0.0.1:6379> RENAMENX name2 name//name不存在所以修改成功
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
更多的学习命令可以去官网查询api:https://www.redis.net.cn/order/
1、String(字符串)
普通的set、get省略
String类似的应用场景:value除了是字符串还可以是数字,用途举例:
- 计数器
- 统计多单位的数量:uid:10000:follow 0
- 粉丝数量
- 对象储存缓存
2、 List(列表)
1.Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左侧)也可以添加到尾部(右侧)
2.一个列表最多可以包含2的32次方-1个元素(4294967295,每个列表可以包含超过40亿个元素)
3.list中插入的值是可以重复的
首先列表可以经过规则定义将其变为队列(先进先出)、栈(先进后出)、双端队列等
正如图中Redis中List是可以进行双端操作的,所以命令也就分成了LXXX和RLLL两类,有时候L也表示List例如LLEN
插入list的值是可以重复的
LIST小结
- list实际上是一个链表
- 如果key不存在,则创建新的链表
- 如果key存在,则新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低
应用场景:
消息排队,消息队列(Lpush Rpop),栈(Lpush Lpop)
3、Set(集合)
1.Redis的Set是string类型的无序集合,集合成员是唯一的,这就意味着集合中不能出现重复的数据。
2.Redis集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
3.集合中最大的成员数是2的32次方-1(4294967295,每个集合可储存40多亿个成员)。
应用场景
- 黑名单
- 白名单
4、Hash(哈希)
1.Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象。
2.Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。
Hash适用于存储变更的数据user name age,尤其是用户信息之类经常变动的信息!Hash更适合于对象的存储,String更加适合字符串的存储!
应用场景:
- 双11活动日,推出抢购活动,每种商品上线1000件,超卖等实际问题
5、Zset(有序集合)
1.与Set不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序的。
score相同:按字典顺序排序
2.有序集合的成员是唯一的,但分数(score)却可以重复
应用场景
- set排序 :1.存储班级成绩表 2.工资表排序
- 普通消息:1.重要消息 2.带权重进行判断
- 排行榜应用实现,取TOP N测试
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81922.html