Redis有16个数据库,默认使用的第零个
可以使用select进行切换数据库
可以查看当前数据库的大小
keys * 查看所的key
清空当前库
清空全部数据库
Redis是单线程的
Redis是很快的,Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了。
Redis为什么单线程还那么快?
1.误区:高性能的服务器一定是多线程的?
2.误区:多线程一定比单线程效率高?
核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程会CPU上下文切换,比较耗时。多次读写都是在一个cpu上的,所以说在内存情况下,这个就是最佳方案。
Redis数据类型
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
判断key是不是存在
设置过期时间,以及查看剩余秒数
查看key是什么类型
String类型
动态修改redis中的字符串 ,追加字符串,如果追加的key不存在就相当于set一个key
查看字符串的长度
网页的浏览量其实就是用redis实现的
截取字符串,下标从0开始,-1是查看全部的
替换字符串
setnx 不存在在设置(在分布式锁中会常常使用),如果set的key存在,会set失败
setex set一个key并设置过期时间
mset set多个key
mget 获取多个key
msetnx如果存在就会set失败
这里是key的一个巧妙的设计:user:{id}:{filed},如此设计在redis中是完全ok的
getset组合命令,如果不存在值会set进去值,并返回空
如果存在值会获取原来的值,并更新新的值
String类型的使用场景:value除了是我们的字符串还可以是我们的数字
- 计数器
- 统计多单位的数量
- 对象缓存存储
List类型
基本的数据类型,列表
所有的List命令都是用L开头的
LPUSH 将一个值或多个值,插入列表的头部(左)
RPUSH 放到列表尾部(右)
Redis不区分大小写命令
移除
LPOP 移除列表的第一个元素
RPOP 移除list的最后一个元素
Lindex 通过下标获取值
返回列表长度
移除指定的值:lrem
ltrim截取指定的,通过下标进行修剪
移除列表中的一个元素并移到一个新的列表中
rpoplpush
lset 将列表中的指定下标的值替换为另外一个值,相当于执行一个更新操作
如果不存在列表报错,如果存在则会更新
LINSTER插入一个值
在一个key之前插入
在一个key之后插入
小结:
- 他实际上是一个链表,before Node after ,left,right 都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
- 既可以作为队列,也可以作为栈
Set(集合)
set中的值是不能重复的,set开头都是s
scard获取set集合中的内容元素个数
srem移除某一个值
set无序不重复集合。抽随机
随机抽选出一个元素
随机删除元素
spop
将一个指定的值移动到另外一个set集合中
smove
微博、B站,共同关注(并集)
数字集合类
- 差集 查询两个set集合中不同的 sdiff
- 交集 sinter 查询相同的
- 并集 查询一共的、共同的 sunion
Hash(哈希)
Map集合,key-map
hash都是h开头
存值、取值
hmset 存多个、hmget取多个
hgetall查看全部的key-value
删除哈希指定的key字段,对应的value也对应消失 hdel
获取hash表中的字段数量
判断hash中的key是否存在
只获得所有的key,只获得所有的value
hash与String类型类似
hash更适合于对象的存储,String更加适合字符串的存储
Zset(有序集合)
在set的基础上,增加了一个值,增加了一个排序
在系统中可以用做排序
添加一个值,添加多个值
从最小值到最大值排序
移除
获取有序集合中的个数
从大到小进行排序
查询某个区间的