这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
1、Redis基本命令
1 | properties复制代码# 切换数据库 |
1.1 key
1 | properties复制代码# 删除指定key(一个或多个) |
EXPIRE key命令,应用场景
- 限时的优惠活动信息
- 手机验证码
- 限制网站访客访问频率
1.2 key命名规范
redis中单个key存入512M大小。
NOSQL中数据与数据间是没有任何关联的,通过命名来解决。
- key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且降低查询效率;
- key也不要太短,太短的话,可读性降低;
- 在一个项目中,key最好使用统一的命名模式,例如:user:id :name、user&id&name;
- key的名称区分大小写,命令不区分大小写。
2、Redis 数据类型
2.1 String
2.1.1 简介:
string 是 redis最基本的数据类型,一个key对应一个value,一个键最大能存储512MB;
string 类型是二进制安全的,意思是 redis 的string 可以包含任何数据,比如:jpg图片或序列化的对象。
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出。
二进制安全特点:
- 编码、解码发生在客户端完成,执行效率高;
- 不需要频繁的编码解码,不会出现乱码
2.1.2 string命令
1 | properties复制代码# 赋值语法 |
1 | properties复制代码# 取值语法 |
1 | properties复制代码# 删除语法 |
1 | properties复制代码# 自增、自减,并返回结果数 |
2.1.3 应用场景
- String 通常用于保存单个字符串或JSON字符串数据;
- 因String是二进制安全的,所以完全可以把一个图片文件的内容作为字符串来存储;
- 计数器,(常规key-value 缓存应用,常规技术:阅读数、评论数)
**INCR 等指令本身就是具有原子操作的特性,**所以我们完全可以利用 INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。
不少网站都利用redis的这个特性来实现业务上的统计计数需求。
2.2 hash类型
2.2.1 简介
- hash 是一个string类型的 field 和 value 的映射表,hash特别适合用与存储对象。
- redis 中可以存储 2^32 - 1 键值对(40多亿),可以看做具有KEY和VALUE的map容器,该类型非常适合于存储值对象的信息,如:uname,ugender,uage。该类型的数据仅占用很少的磁盘空间(相比于JSON)。
2.2.2 hash命令
1 | properties复制代码# 赋值语法 |
1 | properties复制代码# 取值语法 |
1 | properties复制代码# 删除语法 |
1 | properties复制代码# 其他语法 |
2.2.3 应用场景
- 常用于存储一个对象;
- 为什么不用string存储一个对象?
+ hash是最接近关系型数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放到redis中;
+ 用string存储对象的两种方式:
- 第一种,将用户id作为查找的key,把其他信息封装成一个对象以序列化的方式存储(json)。缺点:增加了序列化/反序列化的开销,并且在需要修改其中一项信息中,需要把整个对象取出,并且修改操作需要对并发进行保护,引入CAS等复杂问题;
1
properties复制代码例:key:id,value:{json串}
- 第二种,这个用户信息对象有多少成员就存成多少个key-vale对,用户ID+对应属性的名称作为唯一表示来取得对应属性的值。(例:set user:id 1;set user:name xiaojian;set user:gender "男" )虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费巨大。
1 | properties复制代码例: |
2.3 List类型
2.3.1 简介
简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或尾部(右边)
List 存入的元素的结构就像栈堆,先进后出
类似于 Java 的 LinkedList
1 | properties复制代码127.0.0.1:6379> lpush list2 1 |
2.3.2 List命令
1 | properties复制代码# 赋值语法 |
1 | properties复制代码# 取值语法 |
1 | properties复制代码# 删除语法 |
2.3.3 应用场景
- 对数据量显示、关注列表、粉丝列表、留言评价等…分页、热点新闻(Top5)等;
利用 LRANGE 还可以很方便的实现分页的功能;在博客系统中,每篇博文的评论也可以存入一个单独的list中。
- 任务队列
list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过 ORDER BY来进行排序
1 | properties复制代码#任务队列介绍(生产者和消费者模式): |
2.4 Set 类型
2.4.1 简介
不允许存在重复元素的集合,无序
Redis集合时通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1),
set是通过 hashtable
实现的,
集合中的最大成员数为 2^32^ - 1(4294967295,每个集合可存储40多亿个成员)
类似 Java 中的成员 Hashtable
集合
2.4.2 Set 命令
1 | properties复制代码# 赋值语法 |
1 | properties复制代码# 取值语法 |
1 | properties复制代码# 删除语法 |
2.4.3 应用场景
常应用于:对两个集合间的数据 [计算] 进行交集、并集、差集运算
- 利用集合操作,可以取不同兴趣圈子的交集,以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
- 利用唯一性,可以统计访问网站的所有独立 IP、存取当天(或某天)的活跃用户列表。
2.5 ZSet 类型
2.5.1 简介
有序集合(sorted set)
不允许重复元素,且元素有序
插入元素时都会关联一个double类型的分数(score),以分数从小到大排序
有序集合的成员是唯一的,但分数(score)却可以重复
(我们将在redis中的有序集合叫做zsets,这是因为在 redis 中,有序集合相关的操作指令都是以z开头的)
2.5.2 ZSet 命令
1 | properties复制代码# 赋值语法 |
1 | properties复制代码# 取值语法 |
1 | properties复制代码# 删除语法 |
2.5.3 应用场景
常应用于:排行榜
销量排名,积分排名等
2.6 HyperLogLog
简介
1 | 复制代码Redis 在2.8.9 版本添加了 HyperLogLog 结构 |
1 | 复制代码在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。 |
1 | markdown复制代码什么是基数? |
2.6.1 常用命令
1 | properties复制代码# 添加指定元素到 HyperLogLog 中 |
2.6.2 应用场景
基数不大,数据量不大就用不上,会有点大材小用浪费空间
有局限性,就是只能统计基数数量,而没有办法知道具体内容是什么
1 | tex复制代码统计注册 IP 数 |
本文转载自: 掘金