Redis
redis默认有16个数据库
select 可以切换数据库
清除当前数据库 flushdb
清除所有数据库flushall
redis是单线程
redis是很快的,官方表示,redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了。
核心:redis是将所有数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!)对于内存系统来说,如果没有上下文切换效率就是最高的! 多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
String
时间expire key 秒数
ttl key 查看剩余过期秒数
append key value 在已有的字符串后面追加字符串,如果没有就新插入
incr key 自增,应用场景有多少人看过
decr key 减
incrby key 步长值 可以设置自增多少
getrange key 开始位置 结束位置 结束=-1 查看所有字符串
setrange 修改固定位置字符串
setex (set with expire) 设置过期时间
setnx(set if not exist) 不存在再设置 (在分部所中常常使用)
mset k1 v1 k2 v2 可以插入多个值
msetnx k1 v1 k4 v4 原子性操作 只要有一个插入不了所有就插入不了
getset 先get再set ,如果不存在值返回null ,如果存在返回当前值
List
可以重复
lpush 加入元素 从左边插入数据,左边是头
lrange 取一定范围的值
Rpush加入元素 从右边插入数据,右边是尾部
lpop 左边移除第一个
rpop 右边移除第一个
lindex 左边下标值
llen 获取长度
lrem list几个 value 移除指定的value
ltrim list 起始位置 终止位置 截断两边数据
rpoplpush 原来list 移动后list 从哪里移除添加到哪里
lset list 索引值 value 如果没有list或者没有下标值 则报错
linsert list after/before 在哪个值之前或者之后插入 插入值
小结
- 他实际是一个链表,before node after ,left ,right 都是可以插入值
- 如果key不存在,创建新的链表
- 如果key存在新增内容
- 如果移除了所有制也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率低一些
消息队列(lpush +rpop),栈(lpush+lpop)
Set(集合)
sadd 添加元素
smembers 查看所有元素
sismember 查看某一元素是否在集合中
srem 移除某一元素
scard 查看剩余元素个数
srandmember 随机抽取一个元素
spop 随机移除元素
smove 原集合 需要移动的集合 需要移动的值
sdiff 两个集合差集
sinter 两个集合交集 共同好友就可以实现
sunion 两个集合并集
实际应用
共同好友,推荐好友等
Hash(哈希)
Map集合,key - map! 本质跟String没什么区别
hset 插入
hmset 插入多个元素
hmget 取出多个元素
hgetall 取出全部元素
hdel 删除某一个值
hlen获取哈希表数量
hkeys 获取所有key
hvals 获取所有的value
incr decr 自增跟String类似
hincrby 可以设置步长
hsetnx 如果不存在就加值,存在则不加
hash更改的数据 ,适合存储用户信息
zset(有序集合)
zadd 集合 顺序 值
zrangebyscore 集合 -inf +inf
获取全部的值 从小到大排序
zrevrange 集合 0 -1 从大到小
zrange 集合 0 -1
全部值
zcount 集合 获取中间值
实例 排行榜
其它命令可以去查看官方文档
事务
Redis事物本质:一组命令的集合!一个失误中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
一次性\顺序性\排他性
--------队列 set set set 执行 ----------
Redis事务没有隔离级别概念!
所有命令在事务中,并没有被直接执行!只有发起执行命令的时候才会执行!
Redis单条命令式保存原子性的,但是事务不保证原子性!
- 开启事务(multi)
- 命令入队(…)
- 执行事务(exec)
正常执行事务
只有在执行事务才能顺序的执行事务
放弃事务!
- 放弃事务(discard)
就不会执行队列里的任何语句!
编译型异常(代码有问题!命令有错!),事务中所有的命令都不会被执行
运行时异常(1/0),如果事务队列中存在语法性,那么执行命令时候,其他命令可以正常执行的,错误的命令抛出异常!
监控!
watch监控
乐观锁实现,如果发现值已经被修改那么事务就会修改失败
redis.conf
1.配置文件unit单元大小写不敏感
包含
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsYGQtwi-1647488385699)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220316194536932.png)]
网络
bind 127.0.0.1 #绑定ip
protected-mode yes #保护模式
port 6379 #端口设置
通用 GEN
daemonize yes #以守护进程的方式运行,默认是no,我们需要自己开启为yes!
pidfile /var/run/redis_6379.pid #如果以后台的方式运行,我们就需要指定一个pid文件
loglevel notice
logfile "" #日志的文件位置名
databases 16 #数据库的数量,默认是16个数据库
快照
持久化.在规定时间内,执行了多少次操作,则会持久化到文件.rdb.aof
redis是内存数据库,如果没有持久化,那么它断电及消失!
# 如果900秒内,至少有1个key进行了修改,我们及进行持久化
save 900 1
# 如果300秒内,至少有10个key进行了修改,我们及进行持久化
save 300 10
# 如果60秒内,至少有10000个key进行了修改,我们及进行持久化
save 60 10000
SECURITY 安全
可以在这里设置Redis密码,默认没有密码
config get requirepass #获取
config set requirepass #设置
Clients 客户端
maxclients 10000 #默认能连接redis最大连接数
maxmemory <bytes> #redis配置最大的内存容量
maxmemory-policy noeviction #内存到达上限之后处理策略
1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
2、allkeys-lru : 删除lru算法的key
3、volatile-random:随机删除即将过期key
4、allkeys-random:随机删除
5、volatile-ttl : 删除即将过期的
6、noeviction : 永不过期,返回错误
APPEND ONLY MODE 模式 AOF配置
appendonly no #默认不开启aof模式,默认使用的是rdb方式持久化的,在大部分所有的情况,rdb完全够用!
appendfilename "appendonly.aof" #持久化的文件名
# appendfsync always #每次修改都会sync.消耗性能
appendfsync everysec #每秒执行一次,可能会丢失这一秒数据
# appendfsync no #不执行sync,这个时候操作系统自己同步数据,速度最快!
Redis
redis默认有16个数据库
select 可以切换数据库
清除当前数据库 flushdb
清除所有数据库flushall
redis是单线程
redis是很快的,官方表示,redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了。
核心:redis是将所有数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!)对于内存系统来说,如果没有上下文切换效率就是最高的! 多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
String
时间expire key 秒数
ttl key 查看剩余过期秒数
append key value 在已有的字符串后面追加字符串,如果没有就新插入
incr key 自增,应用场景有多少人看过
decr key 减
incrby key 步长值 可以设置自增多少
getrange key 开始位置 结束位置 结束=-1 查看所有字符串
setrange 修改固定位置字符串
setex (set with expire) 设置过期时间
setnx(set if not exist) 不存在再设置 (在分部所中常常使用)
mset k1 v1 k2 v2 可以插入多个值
msetnx k1 v1 k4 v4 原子性操作 只要有一个插入不了所有就插入不了
getset 先get再set ,如果不存在值返回null ,如果存在返回当前值
List
可以重复
lpush 加入元素 从左边插入数据,左边是头
lrange 取一定范围的值
Rpush加入元素 从右边插入数据,右边是尾部
lpop 左边移除第一个
rpop 右边移除第一个
lindex 左边下标值
llen 获取长度
lrem list几个 value 移除指定的value
ltrim list 起始位置 终止位置 截断两边数据
rpoplpush 原来list 移动后list 从哪里移除添加到哪里
lset list 索引值 value 如果没有list或者没有下标值 则报错
linsert list after/before 在哪个值之前或者之后插入 插入值
小结
- 他实际是一个链表,before node after ,left ,right 都是可以插入值
- 如果key不存在,创建新的链表
- 如果key存在新增内容
- 如果移除了所有制也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率低一些
消息队列(lpush +rpop),栈(lpush+lpop)
Set(集合)
sadd 添加元素
smembers 查看所有元素
sismember 查看某一元素是否在集合中
srem 移除某一元素
scard 查看剩余元素个数
srandmember 随机抽取一个元素
spop 随机移除元素
smove 原集合 需要移动的集合 需要移动的值
sdiff 两个集合差集
sinter 两个集合交集 共同好友就可以实现
sunion 两个集合并集
实际应用
共同好友,推荐好友等
Hash(哈希)
Map集合,key - map! 本质跟String没什么区别
hset 插入
hmset 插入多个元素
hmget 取出多个元素
hgetall 取出全部元素
hdel 删除某一个值
hlen获取哈希表数量
hkeys 获取所有key
hvals 获取所有的value
incr decr 自增跟String类似
hincrby 可以设置步长
hsetnx 如果不存在就加值,存在则不加
hash更改的数据 ,适合存储用户信息
zset(有序集合)
zadd 集合 顺序 值
zrangebyscore 集合 -inf +inf
获取全部的值 从小到大排序
zrevrange 集合 0 -1 从大到小
zrange 集合 0 -1
全部值
zcount 集合 获取中间值
实例 排行榜
其它命令可以去查看官方文档
事务
Redis事物本质:一组命令的集合!一个失误中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
一次性\顺序性\排他性
--------队列 set set set 执行 ----------
Redis事务没有隔离级别概念!
所有命令在事务中,并没有被直接执行!只有发起执行命令的时候才会执行!
Redis单条命令式保存原子性的,但是事务不保证原子性!
- 开启事务(multi)
- 命令入队(…)
- 执行事务(exec)
正常执行事务
只有在执行事务才能顺序的执行事务
放弃事务!
- 放弃事务(discard)
就不会执行队列里的任何语句!
编译型异常(代码有问题!命令有错!),事务中所有的命令都不会被执行
运行时异常(1/0),如果事务队列中存在语法性,那么执行命令时候,其他命令可以正常执行的,错误的命令抛出异常!
监控!
watch监控
乐观锁实现,如果发现值已经被修改那么事务就会修改失败
redis.conf
1.配置文件unit单元大小写不敏感
包含
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qexFr23b-1647488386435)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220316194536932.png)]
网络
bind 127.0.0.1 #绑定ip
protected-mode yes #保护模式
port 6379 #端口设置
通用 GEN
daemonize yes #以守护进程的方式运行,默认是no,我们需要自己开启为yes!
pidfile /var/run/redis_6379.pid #如果以后台的方式运行,我们就需要指定一个pid文件
loglevel notice
logfile "" #日志的文件位置名
databases 16 #数据库的数量,默认是16个数据库
快照
持久化.在规定时间内,执行了多少次操作,则会持久化到文件.rdb.aof
redis是内存数据库,如果没有持久化,那么它断电及消失!
# 如果900秒内,至少有1个key进行了修改,我们及进行持久化
save 900 1
# 如果300秒内,至少有10个key进行了修改,我们及进行持久化
save 300 10
# 如果60秒内,至少有10000个key进行了修改,我们及进行持久化
save 60 10000
SECURITY 安全
可以在这里设置Redis密码,默认没有密码
config get requirepass #获取
config set requirepass #设置
Clients 客户端
maxclients 10000 #默认能连接redis最大连接数
maxmemory <bytes> #redis配置最大的内存容量
maxmemory-policy noeviction #内存到达上限之后处理策略
1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
2、allkeys-lru : 删除lru算法的key
3、volatile-random:随机删除即将过期key
4、allkeys-random:随机删除
5、volatile-ttl : 删除即将过期的
6、noeviction : 永不过期,返回错误
APPEND ONLY MODE 模式 AOF配置
appendonly no #默认不开启aof模式,默认使用的是rdb方式持久化的,在大部分所有的情况,rdb完全够用!
appendfilename "appendonly.aof" #持久化的文件名
# appendfsync always #每次修改都会sync.消耗性能
appendfsync everysec #每秒执行一次,可能会丢失这一秒数据
# appendfsync no #不执行sync,这个时候操作系统自己同步数据,速度最快!