基本数据结构
string字符串
1) 字符串的值既可以存储文字数据,又可以存储二进制数据
2)MSET\MGET 命令可以有效地减少程序的网络通信次数,从而提高程序的执行效率
3)redis用户可以定制命名格式来提升redis数据的可读性并避免冲突。
应用举例:
缓存热门图片:
set redis-log.jpg redis-log-data
存储文章
文章长度计数功能、文章摘要、文章计数
文章长度:strlen article:10086:content
文章摘要: getrange article:10086:content 0 5
文章阅读计数:incr article:10086:count
限速器
防止网站内容被网络爬虫疯狂抓取,限制每个 ip 地址在固定的时间段内能够访问的页面数量,比如1 分钟最多只能访问 30 个页面
防止用户的账号遭到暴力破解,如果同个账号连续好几次输入错误的密码,则限制账号的登录,只能等 30 分钟后再次登录,比如设置 3 次
(1)set max:execute:times 3 防止暴力破解
(2)密码出错时 decr max:execute:times
(3)当 max:execute:times 的值小于 0 时则禁止登录,并可以设置
setex login:error:darren 1800 “Incorrect password”
然后使用 ttl login:error:darren 检测对应剩余的时间
Hash 散列
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储
键值对(40 多亿)
散列的最大优势,只需要在数据库里面创建一个键,就可以把任意多的字段和值存储到散列里面。
但是字符串键的优势是功能更加丰富,而且可以针对一条数据进行操作,hash的话只能针对一整个键的值操作
比如我们要设置键过期时间,键过期时间是针对整个键的,用户无法为散列中的不同字段设置不同的过期时间,所以当一个散列键过期的时候,他包含的所有字段和值都会被删除。
与此相反,如果用户使用字符串键存储信息项,就不会遇到这样的问题——用户可以为每个字符串键分别设置不同的过期时间,让它们根据实际的需要自动被删除
适用场景对比:
- 如果程序需要为单个数据项单独设置过期的时间,那么使用字符串键。
- 如果程序需要对数据项执行诸如 SETRANGE、GETRANGE 或者 APPEND 等操作,那么优先考虑使用字符串键。
当然,用户也可以选择把数据存储在散列中,然后将类似 SETRANGE、GETRANGE 这样的操作交给客户端执行。 - 如果程序需要存储的数据项比较多,并且你希望尽可能地减少存储数据所需的内存,就应该优先考虑使用散列键
- 如果多个数据项在逻辑上属于同一组或者同一类,那么应该优先考虑使用散列键。
List 列表
set集合
Zset 有序集合
Redis发布订阅
redis事务
redis管道技术
管道技术最显著的优势就是提高了redis服务的性能
tcp抓包命令
sudo tcpdump -i any dst host 127.0.0.1 and port 7369