redis基本数据结构

一、redis核心原理

1、redis单线程为什么还能这么快

因为所有的数据存储在内存中,所有的运算都是内存级别的,而且单线程避免了多线程的切换性能损耗问题。

2、redis单线程如何处理那么多的并发客户端连接

redis采用I/O多路复用。io多路复用是利用epoll来实现IO多路复用,将连接信息和事件放入到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器
在这里插入图片描述

##二、redis核心数据结构

1、String

常用操作:
SET key value   									//存入字符串键值对
MSET key value[key value ...]						//批量存储字符串键值对
SETNX key value										//存入一个不存在的字符串的键值对【常用作分布式锁】
GET key												//获取一个字符串键值
MGET key [key ...]									//批量获取字符串键值
DEL key [key ...]									//批量删除
EXPIRE key seconds									//设置一个键的过期时间(秒)

应用场景:

单值缓存:
SET key value
GET key

对象缓存:
1、SET USER:1 VALUE(JSON格式数据)
2、MSET USER:1:NAME ZHANGSAN USER:2:BALANCE 500
   MGET USER:1:NAME USER:1:BALANCE
   
分布式锁:
SETNX PRODUCT:1001 TRUE 						//返回1代表获取锁成功
SETNX PRODUCT:1001 TRUE 						//返回0代表获取锁失败

计数器:
INCR ARTICLE:READCOUNT:{文章id}				  //每有一个人读了该文章,计数值加一
INCR ARTICLE:READCOUNT:{文章id}				  //获取到文章的浏览次数

2、Hash

常用操作:
HSET key field value								//存储一个哈希表key的键值
HSETNX key field value								//存储一个不存在的哈希表key的键值
HMSET key field value[field value ...]				//在一个哈希表key中存储多个键值
HGET key field										//获取哈希表中key对应的field键值
HMGET key field [field ...]							//批量获取哈希表key中多个field键值
HDEL key field [field ...]							//删除哈希表key中的field键值
HLEN key											//返回哈希表key中field的数量
HGETALL key											//返回哈希表key中所有的键值

HINCRBY key field increment							//为哈希表key中的field键的值加上增量

应用场景:

对象缓存:
HMSET user {userId}:name zhangsan {userId}:balance 500
HMSET user 1:name zhangsan 1:balance 500
HMGET user 1:name 1:balance
电商购物车:
1)以用户id为key
2)商品id为field
3)商品数量为value

购物车操作:
1)添加商品-> HSET car:1001 10001 1
2)增加数量-> HINCRBY car:1001 10001 1
3)商品数量->HLEN car:1001
4)删除商品->HDEL car:1001 10001
5)获取购物车所有商品->HGETALL car:1001

Hash结构的优缺点:
	优点:
	同类数据归类整合存储,方便数据管理
	相比String操作消耗内存与CPU资源更少
	相比String存储更节省空间
	
	缺点:
	过期功能不能使用在field上,只能用在key上
	Redis集群架构下不适合大规模使用

3、List

常用操作:
	LPUSH key value[value ...]					//将一个或多个值插入到key列表的表头【最左边开始】
	RPUSH key value[value ...]					//将一个或多个值插入到key列表的表头【最右边开始】
	LPOP key									//移除并返回key列表的头元素
	RPOP key									//移除并返回key列表的尾元素
	LRANGE key start stop						//返回列表key中指定区间的元素
	BLPOP key [key ...] timeout					//从key列表表头弹出一个元素,若列表中没有元素就阻塞等待timeout秒,如果													timeout=0,就一直阻塞等待
	BRPOP key [key ...] timeout					//从key列表表头弹出一个元素,若列表中没有元素就阻塞等待timeout秒,如果													timeout=0,就一直阻塞等待
	
常用数据结构:
	Stack = LPUSH+LPOP
	Queue = LPUSH+RPOP
	Blocking MQ = LPUSH+BRPOP
	
应用场景:
	微博/微信公众号消息:
	假如你关注了XX日报、广州吃喝玩乐
	1)XX日报发微博,消息id为1001
	LPUSH msg:{你的id} 1001
	2)广州吃喝玩乐发微博,消息id为1002
	LPUSH msg:{你的id} 1002
	3)查看最新微博
	LRANGE msg:{你的id} 0 4

4、Set

常用操作:
	SADD key member [member ...]					//往集合key中存入元素,元素存在则忽略,key不存在则新建
	SREM key member [member ...]					//从集合key中删除元素
	SMEMBERS key									//获取集合key中所有元素
	SCARD key										//获取集合key中元素个数
	SISMEMBER key member							//判断member元素是否存在于集合key中
	SRANDMEMBER key [count]							//从集合key中选出count个元素,不删除元素
	SPOP key [count]								//从集合key中选出count个元素,删除元素
	
运算操作:
	SINTER key [key ...] 							//交集运算
	SINTERSTORE destination key [key ..]			//将交集结果存入新集合destination中
	SUNION key [key ..] 							//并集运算
	SUNIONSTORE destination key [key ...]			//将并集结果存入新集合destination中
	SDIFF key [key ...] 							//差集运算
	SDIFFSTORE destination key [key ...]			//将差集结果存入新集合destination中
	
应用场景:
	微信抽奖小程序
        1)点击参与抽奖加入集合
        SADD key {userlD}
        2)查看参与抽奖所有用户
        SMEMBERS key	  
        3)抽取count名中奖者
        SRANDMEMBER key [count] / SPOP key [count]
	微信/微博点赞、收藏、标签
        1) 点赞
        SADD like:{消息ID} {用户ID}
        2) 取消点赞
        SREM like:{消息ID} {用户ID}
        3) 检查用户是否点过赞
        SISMEMBER like:{消息ID} {用户ID}
        4) 获取点赞的用户列表
        SMEMBERS like:{消息ID}
        5) 获取点赞用户数 
        SCARD like:{消息ID}
       

Set集合操作:

在这里插入图片描述

SINTER set1 set2 set3 -> { c }
SUNION set1 set2 set3 -> { a,b,c,d,e }
SDIFF set1 set2 set3 ->{ a }

5、Zset

ZSet常用操作
    ZADD key score member [[score member]…]					//往有序集合key中加入带分值元素
    ZREM key member [member …]								//从有序集合key中删除元素
    ZSCORE key member 										//返回有序集合key中元素member的分值
    ZINCRBY key increment member							//为有序集合key中元素member的分值加上increment 
    ZCARD key												//返回有序集合key中元素个数
    ZRANGE key start stop [WITHSCORES]						//正序获取有序集合key从start下标到stop下标的元素
    ZREVRANGE key start stop [WITHSCORES]					//倒序获取有序集合key从start下标到stop下标的元素

Zset集合操作
    ZUNIONSTORE destkey numkeys key [key ...] 				//并集计算
    ZINTERSTORE destkey numkeys key [key …]					//交集计算
    

​ Zset应用场景:
​ Zset集合操作实现排行榜
​ 1)点击新闻
​ ZINCRBY hotNews:20190819 1 守护香港
​ 2)展示当日排行前十
​ ZREVRANGE hotNews:20190819 0 9 WITHSCORES
​ 3)七日搜索榜单计算
​ ZUNIONSTORE hotNews:20190813-20190819 7
​ hotNews:20190813 hotNews:20190814… hotNews:20190819
​ 4)展示七日排行前十
​ ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES

WITHSCORES
​ 3)七日搜索榜单计算
​ ZUNIONSTORE hotNews:20190813-20190819 7
​ hotNews:20190813 hotNews:20190814… hotNews:20190819
​ 4)展示七日排行前十
​ ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值