redis安装与五大核心数据结构

目录

1. redis安装

2.Redis的单线程和高性能

3.redis互联网最常应用五大核心数据结构

3.1 字符串常用操作

3.2 字符串常用场景

3.2.1 单值缓存

3.2.2 对象缓存

3.2.3 分布式锁

3.2.4 计数器

3.2.5 计数器

3.2.6 Web集群session共享

3.2.7 分布式系统全局序列号

3.3 hash常用操作

3.4 hash常用场景

3.4.1 对象缓存

3.4.2 电商购物车

3.5 list常用操作

3.6 常用应用场景

3.6.1 常用数据结构

3.6.2 微博消息和微信公号消息

3.7 set常用操作

3.8 set常用场景:

3.8.1 微信抽奖小程序

3.8.2 微信微博点赞,收藏,标签

3.8.3 集合操作实现微博微信关注模型

3.8.4 电商商品筛选或者条件筛选操作

3.9 zset有序集合结构

3.10 zset常用场景

3.10.1 Zset集合操作实现排行榜


1. redis安装

下载地址:http://redis.io/download 
安装步骤: 
# 安装gcc 
yum install gcc 

# 把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压 
wget http://download.redis.io/releases/redis‐5.0.3.tar.gz 
tar xzf redis‐5.0.3.tar.gz 
cd redis‐5.0.3 

# 进入到解压好的redis‐5.0.3目录下,进行编译与安装 
make 

# 修改redis.conf配置
vi redis.conf或者vim redis.conf
daemonize yes #后台启动 
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis 
# 需要注释掉bind 
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户 端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可) 

cd /usr/local/redis-7.0.2
# 启动服务 
 src/redis‐server redis.conf 

# 验证启动是否成功 
ps ‐ef | grep redis 

# 进入redis客户端 
 src/redis‐cli 

# 退出客户端 
 quit 

# 退出redis服务: 
 (1)pkill redis‐server 
 (2)kill 进程号 
 (3)src/redis‐cli shutdown

第二次进入服务器:
cd /usr/local/redis-7.0.2
src/redis-server redis.conf
src/redis-cli

2.Redis的单线程和高性能

Redis是单线程吗?
Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
Redis 单线程为什么还能这么快?
因为它所有的数据都在 内存 中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性 能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如
keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
Redis 单线程如何处理那么多的并发客户端连接?
Redis的 IO多路复用 :redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到
文件事件分派器,事件分派器将事件分发给事件处理器。
3.  其他高级命令
keys:全量遍历键 用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,
性能比较差,要避免使用
scan:渐进式遍历键
SCAN cursor [MATCH pattern] [COUNT count]
scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,
第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。
注意: 但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。
Info: 查看redis服务运行信息,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:
Server 服务器运行的环境参数
Clients 客户端相关信息
Memory 服务器运行内存统计数据
Persistence 持久化信息
Stats 通用统计数据
Replication 主从复制相关信息
CPU CPU 使用情况
Cluster 集群信息
KeySpace 键值对统计数量信息
127.0.0.1:6379> scan 0 match key* count 10
1) "7"    #游标
2) 1) "key"
   2) "keyb"
   3) "keys"
   4) "keyy"
127.0.0.1:6379> keys *
1) "key"
2) "locations"

3.redis互联网最常应用五大核心数据结构

常用数据结构:string,hash,list,set,sorted set

官网命令传送门!!!

3.1 字符串常用操作

SET  key  value 			//存入字符串键值对
MSET  key  value [key value ...] 	//批量存储字符串键值对
SETNX  key  value 		//存入一个不存在的字符串键值对
GET  key 			//获取一个字符串键值
MGET  key  [key ...]	 	//批量获取字符串键值
DEL  key  [key ...] 		//删除一个键
EXPIRE  key  seconds 		//设置一个键的过期时间(秒)


INCR  key 			//将key中储存的数字值加1
DECR  key 			//将key中储存的数字值减1
INCRBY  key  increment 		//将key所储存的值加上increment
DECRBY  key  decrement 	//将key所储存的值减去decrement
127.0.0.1:6379> setnx mykey "Hello"
127.0.0.1:6379> get mykey
127.0.0.1:6379> setnx mykey "world"
127.0.0.1:6379> get mykey

3.2 字符串常用场景

3.2.1 单值缓存

127.0.0.1:6379> set key 1
127.0.0.1:6379> get key

3.2.2 对象缓存

127.0.0.1:6379> set user:1 1
127.0.0.1:6379> get user:1
127.0.0.1:6379> del user:1
127.0.0.1:6379> mset user:1:name data user:1:balance 1888
127.0.0.1:6379> mget user:1:name user:1:balance

3.2.3 分布式锁

https://blog.csdn.net/truelove12358/article/details/115331161

set key value nx相当于setnx key value,具体解释详见上面博客链接

127.0.0.1:6379> setnx product:10001 true
(integer) 1    #返回1代表获取锁成功
127.0.0.1:6379> setnx product:10001 true
(integer) 0    #返回0代表获取锁失败
127.0.0.1:6379> del product:10001
(integer) 1    #返回1代表删除锁成功,0代表失败
127.0.0.1:6379> set product:10001 true ex 10 nx    #代表设置单值缓存10秒存活时间
OK
127.0.0.1:6379> get product:10001    #获取值
"true"
127.0.0.1:6379> get product:10001    #10秒后无法获取值
(nil)

3.2.4 计数器

127.0.0.1:6379> incr article:readcount:10001
(integer) 1
127.0.0.1:6379> incr article:readcount:10001
(integer) 2
127.0.0.1:6379> get article:readcount:10001
"2"
127.0.0.1:6379> type article:readcount:10001
string
127.0.0.1:6379> object encoding article:readcount:10001

"int"

3.2.6 Web集群session共享

spring session + redis实现session共享,不是很懂什么意思

参考一下链接吧!

3.2.7 分布式系统全局序列号


127.0.0.1:6379> incrby orderid 1000
(integer) 1000
127.0.0.1:6379> incrby orderid 1000
(integer) 2000
127.0.0.1:6379> get orderid
"2000"


3.3 hash常用操作

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键的值加上增量increment

3.4 hash常用场景

3.4.1 对象缓存

127.0.0.1:6379> hmset user {userid}:name nameValue {userid}:balance 1888
OK
127.0.0.1:6379> hmget user {userid}:name {userid}:balance
1) "nameValue"
2) "1888"
127.0.0.1:6379> hmset user 1:name nameValue 1:balance 1888
OK
127.0.0.1:6379> hmget user 1:name 1:balance {userid}:name {userid}:balance
1) "nameValue"
2) "1888"
3) "nameValue"
4) "1888"
127.0.0.1:6379> type user
hash
127.0.0.1:6379> object encoding user
"ziplist"

3.4.2 电商购物车

#key:cart:1001 field:10088 

127.0.0.1:6379> hset cart:1001 10088 1
(integer) 1    #添加商品成功
127.0.0.1:6379> hset cart:1001 10088 1
(integer) 0    #添加商品失败
127.0.0.1:6379> hincrby cart:1001 10088 2
(integer) 3    #增量添加10088属性数量
127.0.0.1:6379> hincrby cart:1001 10088 2
(integer) 5    #增量添加10088属性数量
127.0.0.1:6379> hlen cart:1001
(integer) 1    #统计key值个数
127.0.0.1:6379> hdel cart:1001 10088
(integer) 1    #删除属性成功
127.0.0.1:6379> hgetall cart:1001    #获取key值所有商品属性
1) "10088"
2) "5"

3.5 list常用操作

LPUSH  key  value [value ...] 		//将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]	 	//将一个或多个值value插入到key列表的表尾(最右边)
LPOP  key			//移除并返回key列表的头元素
RPOP  key			//移除并返回key列表的尾元素
LRANGE  key  start  stop		//返回列表key中指定区间内的元素,区间以偏移量start和stop指定

BLPOP  key  [key ...]  timeout	//从key列表表头弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待

3.6 常用应用场景

3.6.1 常用数据结构

桟(先进后出)=LPUSH+LPOP

队列=LPUSH+RPOP

阻塞队列=LPUSH+BRPOP

#栈结构
27.0.0.1:6379> lpush mylist "world"
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "world"
2) "world"
127.0.0.1:6379> lpop mylist 5
1) "world"
2) "world"
127.0.0.1:6379> lrange mylist 0 -1
(empty array)
#队列
127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "world"
(integer) 2
127.0.0.1:6379> rpop mylist 1
1) "hello"
127.0.0.1:6379> lrange mylist 0 -1
1) "world"

#阻塞队列
127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "world"
(integer) 2
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "hello"
127.0.0.1:6379> lrange mylist 0 -1
1) "world"
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "world"
127.0.0.1:6379> lrange mylist 0 -1
(empty array)
127.0.0.1:6379> brpop mylist 10
(nil)
(10.04s) #阻塞10.04s
127.0.0.1:6379>

3.6.2 微博消息和微信公号消息

微博消息和微信公号消息
LPUSH  msg:test1  10018
LPUSH  msg:test1 10086
3)查看最新微博消息
LRANGE  msg:test1  0  4
127.0.0.1:6379> lpush msg:test1 10018
(integer) 1
127.0.0.1:6379> lpush msg:test1 10086
(integer) 2
127.0.0.1:6379> lrange msg:test1 0 -1
1) "10086"
2) "10018"
127.0.0.1:6379> lrange msg:test1 0 4
1) "10086"
2) "10018"

3.7 set常用操作

sdiff操作key值只能大的在前,小的在后;

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个元素,元素不从key中删除
SPOP  key  [count]				//从集合key中选出count个元素,元素从key中删除

Set运算操作
SINTER  key  [key ...] 				//交集运算
SINTERSTORE  destination  key  [key ..]		//将交集结果存入新集合destination中
SUNION  key  [key ..] 				//并集运算
SUNIONSTORE  destination  key  [key ...]		//将并集结果存入新集合destination中
SDIFF  key  [key ...] 				//差集运算
SDIFFSTORE  destination  key  [key ...]		//将差集结果存入新集合destination中

3.8 set常用场景:

3.8.1 微信抽奖小程序

1)点击参与抽奖加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key      
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]

127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> sadd key 2
(integer) 1
127.0.0.1:6379> smembers key
1) "1"
2) "2"
127.0.0.1:6379> srandmember key 1
1) "1"
127.0.0.1:6379> smembers key
1) "1"
2) "2"
127.0.0.1:6379> spop key 1
1) "1"
127.0.0.1:6379> smembers key
1) "2"

3.8.2 微信微博点赞,收藏,标签

微信微博点赞,收藏,标签
1) 点赞
SADD  like:{消息ID}  {用户ID}
2) 取消点赞
SREM like:{消息ID}  {用户ID}
3) 检查用户是否点过赞
SISMEMBER  like:{消息ID}  {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数 
SCARD like:{消息ID}

 

3.8.3 集合操作实现微博微信关注模型

3.8.4 电商商品筛选或者条件筛选操作

集合操作实现微博微信关注模型
1)共同关注
sinter test test1
2) 我关注的人是否关注了其他人:
sismember test test2
3) 我可能认识的人:
sdiff test2 test1

电商商品筛选:
SADD  brand:huawei  P40
SADD  brand:xiaomi  mi-10
SADD  brand:iPhone iphone12
SADD os:android  P40  mi-10
SADD cpu:brand:intel  P40  mi-10
SADD ram:8G  P40  mi-10  iphone12

SINTER  os:android  cpu:brand:intel  ram:8G


3.9 zset有序集合结构

zet命令后面score是个数字,后面的member一般不能只能打数字,官方使用"";

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 …]	//交集计算

3.10 zset常用场景

3.10.1 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingtanghulu_6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值