redis是单线程的redis的瓶颈是机器的内存和网络的带宽,用单线程既然可以实现,就用单线程了
为什么单线程还这么快呢redis是将所有的数据全部放在内存中,所以说用单线程操作效率最高,多线程(cpu上下文会切换:耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个cpu上,在内存情况下,这个就是最佳的选择。
获取一部分值
获取全部的值
替换值
setex 设置过期时间
setnx 如果没有这个键就设置值成功,如果已存在这个键就设置不成功(在分布式锁中常应用 )
批量设置键和值,批量获取值
msetnx 具有原子性设置对象,以json字符串的形式
getset
lpush 放进列表数据
lrange 取出指定位置的数据,可以看出下标是倒着来的。
从列表中移除值,可以分为移除左边的和右边的
通过下标获取值
获取列表长度llen
移除指定的值,可指定数量
通过下标截取指定的长度
移除列表的最后一个元素,将他移动到新列表中
更新指定位置的值
geoadd 添加地理位置
geopos获得地理位置详细信息
geodist获得两个地点之间的距离,可在后面追加获得结果的单位 km m
georadius获得以某一点经纬度为圆心,一定距离为半径之内的元素
georadiusbymember获得某一成员为圆心,一定距离为半径之内的元素
geo底层的实现原理是zset,可以使用zset命令来操作geohyperloglog
测试
位存储位图,是数据结构,都是操作二进制为来进行操作,只有0和1两个状态
正常执行事务
放弃事务discard
编译型异常(代码有问题),事务中所有命令都不会被执行复制代码
- 127.0.0.1:6379> get k1
- (nil)
- 127.0.0.1:6379> multi
- OK
- 127.0.0.1:6379> set k1 v1
- QUEUED
- 127.0.0.1:6379> set k2 v2
- QUEUED
- 127.0.0.1:6379> getset k3
- (error) ERR wrong number of arguments for 'getset' command
- 127.0.0.1:6379> get k1
- QUEUED
- 127.0.0.1:6379> exec
- (error) EXECABORT Transaction discarded because of previous errors.#所有事务不会被运行
- 127.0.0.1:6379>
运行时异常(1/0),其他命令正常执行,错误命令抛出异常
监视:watch key [key …]
放弃监视unwatch key
包含
可包含多个配置文件
网络
通用
快照持久化:在规定时间内,执行了多少次操作则会持久化到文件.rdb .aof
安全
客户端连接相关
以日志的形式来记录每个写的操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。三种策略
优点和缺点
订阅
发布原理结果:复制代码
- 127.0.0.1:6379> publish hongdou hahaha
- (integer) 1
复制代码
- 1) "message"
- 2) "hongdou"
- 3) "hahaha"
复制原理从机成功连接到主机后会发送一个同步命令
哨兵模式的全部配置完整的哨兵模式配置文件 sentinel.conf
概念在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据(例如秒杀场景)缓存都没有命中的话,就会全部转移到数据库上,造成数据库极大的压力,就有可能导致数据库崩溃。网络安全中也有人恶意使用这种手段进行攻击被称为洪水攻击。
解决方案布隆过滤器
概念相较于缓存穿透,缓存击穿的目的性更强,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。这就是缓存被击穿,只是针对其中某个key的缓存不可用而导致击穿,但是其他的key依然可以使用缓存响应。
解决方案
概念大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
解决方案
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |