Redis学习
本文最后更新于:2023年8月24日 晚上
Redis 简介
Redis是现在最受欢迎的NoSQL数据库之一,即远程字典服务,Redis是一个使用ANSI C编写的开源,包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库
特性
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写
功能
- 多样的数据类型
- 持久化
- 集群
- 事务
为什么快?
Redis 是单线程的,但是Redis很快,官网表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!
Redis是C语言写的,官方提供的数据为 100000+ 的QPS(每秒处理请求数)
核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
误区:
- 高性能的服务器一定是多线程的
- 多线程一定比单线程效率高
开始
中文网: http://www.redis.cn/
windows 下使用
使用github托管仓库:http://github.com/dmajkic/redis/releases
或:https://github.com/tporadowski/redis/releases
启动服务:
1 | |
启动控制台:
1 | |
ping 之后能返回PONG就说明了redis启动正常
linux下使用
可见docker部署redis
redis命令基础
String类型操作
切换库
redis默认是有16个数据库的,默认使用第0个(类似下标)
1 | |
如果有(error) NOAUTH Authentication required.报错,则是因为没有登录,先使用auth登录,:如 auth “FSAN”
查看当前库的大小:
1 | |
设置,获取值
1 | |
记住在哪个库中就行
获取全部键:
1 | |
清空数据库:
清空当前:
1 | |
清空所有:
1 | |
判断是否存在key
1 | |
如果存在则返回1,不存在则是0
移动值到另一个库中:
1 | |
如 move name 1 名字移动到下标1的数据库中,作用于逻辑删除
为键值对设置过期时间
1 | |
secoud为秒数
查看是否过期
1 | |
-1 则无过期
-2 则已过期或不存在该数据
删除数据:
1 | |
查看当前类型:
1 | |
获取字符串长度,添加长度
1 | |
自增1,自减1:
1 | |
增加,减少指定数:
1 | |
setex,setnx(重点)
1 | |
setnx的返回值状态,0表示设置失败,以后常用于做分布式锁
批量操作:
1 | |
设置了三个键值对,获取三个对应的值
1 | |
设置k1 k2的值,但如果存在则设置失败
与上面的mget,mset一样,属于原子性操作,要么一起成功,要么就都失败,回滚
对key的巧妙的设计:
key的名称可以这样取:user:{id}:{filed},如:
1 | |
设置了user:1:name,user:1:age两个数据,10秒过期
这样可以类似关系型数据库,方便顺序取数据
常用组合式命令:
1 | |
先获取user:1:name的值,再设置一个新的值
存储对象:
1 | |
看似存储了一个对象,实际在redis中是存储了一个json字符串,本质还是String类型
List类型操作
添加数据(lpush,rpush):
1 | |
lpush 对指定列表的左边(left)添加一个值
rpush 对指定列表的右边(right)添加一个值
获取数据(lrange):
1 | |
lrange获取列表数据,下标从0开始,取到-1(全部获取)
这里的l意思不是left,是list
1 | |
从myList中获取下标为0-1的数据
默认移除数据(添加使用push,移除就是pop)
1 | |
lpop 从左边移除一个数据
rpop 从右边移除一个数据
执行命令之后,会返回被移除的对象
移除指定的值(lrem)
移除myList中值为FSAN的一条数据
1 | |
l(list)rem(remove)
获取列表长度(llen):
1 | |
l(list)len(length)
裁剪ltrim(只留下指定范围的数据)
现在有六个数据,FSAN6下标为0,FSAN1下标为5
1 | |
只保留下标2到4的数据(即FSAN4,FSAN3,FSAN2):
1 | |
将一个列表的最后一个元素添加到新的列表中(rpoplpush)
1 | |
返回值是被移动的参数
更新列表中的元素(lset):
1 | |
将myListBak中下标为0的元素更新为”useLset”
在列表的指定元素之前或者之后插入元素(linsert)
1 | |
l(list)insert ,在myList列表中的”4”元素之前
如果不存在就会失败
set(集合)类型
set中的值是无序的,不能重复的
set集合中添加元素(sadd)
1 | |
s(set)add
查看指定set中所有值(smembers)
1 | |
s(set)member(成员)s
判断某一个值是不是在set集合中(sismember)
1 | |
s(set)is member,1:在 0:不在
获取set集合中内容元素的个数(scard)
1 | |
移除set集合中的指定元素(srem)
1 | |
- s(set)rem(remove)
从一个集合中随机抽选出元素(srandmember)
1 | |
- s(set)rand(随机)member
- 可以在后面加上数据,表示抽取的个数
抽两个随机数:
1 | |
当数据不够的时候,不会报错,继续返回
随机移除集合中的一个成员(spop):
1 | |
pop在列表中是移除在栈顶的一个元素,但是在set集合中成员是无序的,所以变为随机删除了