Redis入门与应用
Redis为什么这么快?
- redis主要基于内存操作
- 在请求上采用I\O多路复用机制
- redis使用C语言编写,偏向底层
- 协议简单,采用RESP协议
- redis的生态比较成熟,很多家大型公司都在使用,很多相关的知识扩展以及分析
- redis支持多种多样的数据结构,如字符串、tree、ztree、map、等,这些丰富的数据结构,可以满足我们在开发工作大部分常见数据结构,进行存储
- I/O线程和基本操作是单线程的,无线程开销
为什么需要Redis?
- 高性能:
假设下如果所有的数据都从数据库中读取,特别是是一些复杂的数据,每次都查询mysql性能必定非常差。所以对于一些复杂操作耗时查出来的结果且确定后面不怎么变化的数据放到缓存,能大幅提高系统响应。 - 高并发:
mysql单机一般只能支撑到2000Qps,而redis由于是K/V式的操作,单机可以支撑并发量几万到十几万。
Redis是什么?
- Redis一个开源的基于键值对(Key-Value)NoSQL数据库。使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API
- Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能
- 缓存、排行榜系统、计数器应用、社交网络、消息队列系统
应用场景
- Geo数据结构实现摇一摇、附近位置的地理位置的功能
- Redis布隆过滤器解决缓存穿透问题、避免无效磁盘I/O
- HyperLogLog实现大数据量的去重计数方案
- BitMap适用于大数量存储与查找的业务场景,比如打卡签到
- List适用于消息队列
- Set适用于用户标签,社交,查询有共同兴趣爱好的人,智能推荐
- Hash适用于存储对象
- ZSet适用于排行榜
Redis全局命令
Key*
查看所有键
也支持通配符
dbsize
dbsize命令在计算键总数时不会遍历所有键,而是直接获取 Redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1)。
而keys命令会遍历所有键,所以它的时间复杂度是o(n),当Redis保存了大量键时线上环境禁止使用keys命令。
exists
- 检查键是否存在,存在返回1,不存在返回0。
del
删除键,无论值是什么数据结构类型,del 命令都可以将其删除。返回删除键
个数,删除不存在键返回 0。同时 del 命令可以支持删除多个键。
expire
Redis 支持对键添加过期时间,当超过过期时间后,会自动删除键,时间单位秒。
除了 expire、ttl 命令以外,Redis 还提供了 expireat、pexpire,pexpireat、pttl、
persist 等一系列命令。
expireat key timestamp: 键在秒级时间截 timestamp 后过期。
ttl 命令和 pttl 都可以查询键的剩余过期时间,但是 pttl 精度更高可以达到毫
秒级别,有 3 种返回值:
大于等于 0 的整数:键剩余的过期时间(ttl 是秒,pttl 是毫秒)。
-1:键没有设置过期时间。
-2:键不存在。
pexpire key milliseconds:键在 milliseconds 毫秒后过期。
pexpireat key milliseconds-timestamp 键在毫秒级时间戳 timestamp 后过期。
在使用 Redis 相关过期命令时,需要注意以下几点。
1)如果 expire key 的键不存在,返回结果为 0:
2)如果过期时间为负值,键会立即被删除,犹如使用 del 命令一样:
3 ) persist 命令可以将键的过期时间清除:
4)对于字符串类型键,执行 set 命令会去掉过期时间,这个问题很容易在
开发中被忽视。
5 ) Redis 不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如
不能对列表类型的一个元素做过期时间设置。
type
返回键的数据结构类型,例如键 hello 是字符串类型,返回结果为 string。键
mylist 是列表类型,返回结果为 list,键不存在返回 none
randomkey
renamenx
- 为了防止被强行 rename,Redis 提供了 renamenx 命令,确保只有 newKey
不存在时候才被覆盖 - 从上面我们可以看出,由于重命名键期间会执行 del 命令删除旧的键,如果
键对应的值比较大,会存在阻塞 Redis 的可能性。
键名的生产实践
- 为了防止键的冲突和可读性,比如MySQL用数据库名:表名:字段名
Redis常用数据结构
String
- 语法: set key value [ex seconds] [px milliseconds] [nxlxx]
- 例子: set hello redis
- 应用场景: 简单字符串、复杂字符串(JSON、XML)、二进制(图片、音频、视频), 但是值不能超过512M
Hash
- 语法: hset [field] [value1] [value2]
- 例子: hset user:1 name mark
- 应用场景:
List
ZSet
Redis高级数据结构
BitMaps
布隆过滤器
HyperLogLog
Geo
结语
如果文章有错误或者好的建议,欢迎指正。