先介绍一下Redis
简介:REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的 key-value存储系统,是跨平台的非关系型数据库。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。
Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
优势
1:速度快,因为数据存在于内存中,类似hashmap的优势就是查找和操作的时间复杂度都是o(1)
2:支持丰富的数据类型,string、list、hash、set、zset
3:支持事务,操作都是原子性的。
4:丰富的特性:可用于缓存、消息,按key设置过期时间,过期自动删除
应用场景
1、缓存
可以使用String类型
例如:热点数据缓存(例如报表、热销商品),对象缓存、全页缓存、可以提升热点数据的访问数据。
2、数据共享分布式
String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享
例如:分布式Session需要引入此依赖
3、分布式锁
String 类型setnx方法,只有不存在时才能添加成功,返回true
将key 的值设为value ,当且仅当key不存在。
若给定的 key已经存在,则SETNX不做任何动作。
4、全局ID
int类型,incrby,利用原子性
如果是分库分表的场景,一次性拿一段。
5、计数器
int类型,incr方法
例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
6、限流
基于redis的数据结构zset
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以对指定键的值进行排序权重的设定,它应用排名模块比较多。
我们可以将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,可以用UUID生成,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。
7、位统计
String类型的bitcount(1.6.6的bitmap数据结构介绍)
字符是以8位二进制存储的
例如:在线用户统计,留存用户统计,支持按位与、按位或等等操作,计算出7天都在线的用户。
8、购物车
传统的购物车实现有很多种方式,如session,cookie,数据库等,如果用Redis相当于一个内存数据库,可以用来做缓存,存储数据等。
类型用String 或hash。所有String可以做的hash都可以做。
9、用户消息时间线
list,双向链表,直接作为timeline就好了。插入有序。
10、消息队列
List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间。
blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低。
队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列。
栈:先进后出:rpush brpop。
11、抽奖
移除并返回集合中的一个随机元素。
返回集合中一个或多个随机数。
将所有的奖品通过SADD添加到SET集合中,然后通过随机命令获取对应的奖品即可。而且,抽奖一般是有时效性,正好可以配合redis的key的失效时间使用。使得抽奖功能很完美的解决。
12、点赞、签到、打卡
假如上面的微博ID是t1001,用户ID是u3001
用 like:t1001 来维护 t1001 这条微博的所有点赞用户
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001 u3001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001
相对于数据库简单很多
13、商品标签
使用tags:来给对象打标签,然后可以直接查找出来。
14、商品筛选
一个集合进行查找
多个集合进行运算是按照顺序,一路算下去的结果
SDIFF计算差集
SINTER 计算并集
SUNION 计算交集
15、用户关注、推荐模型
实际上就是redis的交集,并集差集的使用交错
举例:
16、排行榜
实现这个功能主要用到的 redis 数据类型是 redis 的有序集合 zset。zset 是 set 类型的一个扩展,比原有的类型多了一个顺序属性。此属性在每次插入数据时会自动调整顺序值,保证 value 值按照一定顺序连续排列。
查看用户 e 的实际排名 (ZREVRANK 为降序,ZRANK 为升序)、实时分数。
先介绍一下Redis
简介:REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的 key-value存储系统,是跨平台的非关系型数据库。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。
Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
优势
1:速度快,因为数据存在于内存中,类似hashmap的优势就是查找和操作的时间复杂度都是o(1)
2:支持丰富的数据类型,string、list、hash、set、zset
3:支持事务,操作都是原子性的。
4:丰富的特性:可用于缓存、消息,按key设置过期时间,过期自动删除
应用场景
1、缓存
可以使用String类型
例如:热点数据缓存(例如报表、热销商品),对象缓存、全页缓存、可以提升热点数据的访问数据。
2、数据共享分布式
String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享
例如:分布式Session需要引入此依赖
3、分布式锁
String 类型setnx方法,只有不存在时才能添加成功,返回true
将key 的值设为value ,当且仅当key不存在。
若给定的 key已经存在,则SETNX不做任何动作。
4、全局ID
int类型,incrby,利用原子性
如果是分库分表的场景,一次性拿一段。
5、计数器
int类型,incr方法
例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
6、限流
基于redis的数据结构zset
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以对指定键的值进行排序权重的设定,它应用排名模块比较多。
我们可以将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,可以用UUID生成,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。
7、位统计
String类型的bitcount(1.6.6的bitmap数据结构介绍)
字符是以8位二进制存储的
例如:在线用户统计,留存用户统计,支持按位与、按位或等等操作,计算出7天都在线的用户。
8、购物车
传统的购物车实现有很多种方式,如session,cookie,数据库等,如果用Redis相当于一个内存数据库,可以用来做缓存,存储数据等。
类型用String 或hash。所有String可以做的hash都可以做。
9、用户消息时间线
list,双向链表,直接作为timeline就好了。插入有序。
10、消息队列
List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间。
blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低。
队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列。
栈:先进后出:rpush brpop。
11、抽奖
移除并返回集合中的一个随机元素。
返回集合中一个或多个随机数。
将所有的奖品通过SADD添加到SET集合中,然后通过随机命令获取对应的奖品即可。而且,抽奖一般是有时效性,正好可以配合redis的key的失效时间使用。使得抽奖功能很完美的解决。
12、点赞、签到、打卡
假如上面的微博ID是t1001,用户ID是u3001
用 like:t1001 来维护 t1001 这条微博的所有点赞用户
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001 u3001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001
相对于数据库简单很多
13、商品标签
使用tags:来给对象打标签,然后可以直接查找出来。
14、商品筛选
一个集合进行查找
多个集合进行运算是按照顺序,一路算下去的结果
SDIFF计算差集
SINTER 计算并集
SUNION 计算交集
15、用户关注、推荐模型
实际上就是redis的交集,并集差集的使用交错
举例:
16、排行榜
实现这个功能主要用到的 redis 数据类型是 redis 的有序集合 zset。zset 是 set 类型的一个扩展,比原有的类型多了一个顺序属性。此属性在每次插入数据时会自动调整顺序值,保证 value 值按照一定顺序连续排列。
查看用户 e 的实际排名 (ZREVRANK 为降序,ZRANK 为升序)、实时分数。