2021-10-12

快速学习redis的搭建数据结构

先安装,进入redis官网https://redis.io/download

**

第一步,官网的查看使用在这里插入图片描述

**documentation是官方文档用于查看,redis的语法使用
thd full list of commands(完整的命令)在这里插入图片描述
**

第二步开始redis的安装步骤

**
我的使用的是linux的镜像版本7多的
下载地址:http://redis.io/download版本下载地址

1.# 安装gcc yum install gcc
#把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压 tar xzf redis‐5.0.3.tar.gz cd redis‐5.0.3
#进入到解压好的redis‐5.0.3目录下
进行编译与安装 make
要到 vi redis-5.0.3/redis.conf
配置 daemonize yes #后台启动 protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户 端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
#启动服务 src/redis‐server redis.conf
#验证启动是否成功 ps ‐ef | grep redis #进入redis客户端 src/redis‐cli

Redis的简介

Redis是一个开源的基于内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。

对于多个客户端同时请求,redis是单线程的,但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

redis的五种数据结构都是key-value的数据结构
在这里插入图片描述
第三步redis的基本使用

**

string字符串的使用

**

set key value //存入字符串的键值对,相似以map的key-value
get key //获取一个字符串的键值对
在这里插入图片描述
也可以进行批量的操作
mset key value [key value] //批量存储字符串键值对
mget key [key…] //获取批量字符串键值
在这里插入图片描述
explre key seconds 当前命令表示 //设置一个键的过期时间(秒)

当前命令可以存入一个不存在的key
setnx key value //存入一个不存在的字符串键值对
在这里插入图片描述
常用的原子操作加减
incr key //用于将key的存储的数值加1
在这里插入图片描述
decr key //将key中的存储的数字值减1
在这里插入图片描述
incrby key increment //将key所存储的值加上 increment
decrby key decrement //将key所存储的值减去decrement
在这里插入图片描述

注意,如果忘记了,命令操作可以使用 要懂得快速的查命令文档帮助,这些不是记,多操作很快就熟悉

在这里插入图片描述
结合实际工作的String业务场景
一般我们工作中使用比较多的是key-value字符串格式,用于存储参数

这边主要讲解一下setnx的使用 分布式锁(多个线程操作只有一个对象强锁成功,类似我们Java的cas)

setnx monghao:100 true //返回1代表获取锁成功
setnx monghao:100 true //返回0代表获取锁失败
。。。。执行业务逻辑药释放锁
del monghao:100 //执行释放锁逻辑
例子如下
在这里插入图片描述
在这里插入图片描述

一般incr key:{文章的编号} 的使用场景比如我们的公众号,有个阅读数量,每个用户请求进入都会自动的追加1
get key:{文章的编号} 获取到总的阅读量
在这里插入图片描述
incrby order:100 1000 可以使用库存的批量购买

**

Hash数据结构的介绍

**
Hash是跟我们的Java中的map的结构key:map{key:value},相当于一个map中在嵌套一个map
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中的filed的数量
在这里插入图片描述
hgetall key //返回哈希表的key中所有的键值

在这里插入图片描述

hincrby key field increment //为哈希表key中的field键值加上增量increment
在这里插入图片描述
应用使用场景

注意点(当数据量非常大的时候要慎重使用hash,比如获取一个哈希表的key对应的field的键值非常大,(预估)大到几十万,当hget的时候会很缓慢


在这里插入图片描述使用场景电商购物车
以用户id为key
商品的id为field
商品的数量为value

购物车的操作
商品的添加-》hset shopping:1010 10086 1
增加商品数量-》hincrby shopping:1010 10086 1
商品的总数-》hlen shopping:1010
删除商品–》hdel shopping:1010
获取购物车所有的商品-》hgetall shoppong:1010

优点
1.对于数据的归类,方便数据管理,层次分明
2.相对比string操作的消耗内存与cpu更小
3.相对比string存储更节省空间

缺点
1.设置过期时间,不能使用在field,只能使用到key上
2,redis集群架构下,不太适合大规模使用,防止hash的key有大数据量

**

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,一直阻塞等待

在这里插入图片描述
常用的数据结构
Stack(栈)=LPUSH+LPOP(先进后出,比如弹夹)
Queue(队列)=LPUSH+RPOP()(先进先出,饭堂排队打饭)
在这里插入图片描述

List的应用场景

比如微信朋友圈设计,小明有多个好友,每个好友都把消息放到队列中,小明去监听这个队列可以获取到所有好友的消息

微博消息和微信公号消息
诸葛老师关注了MacTalk,备胎说车等大V
1)MacTalk发微博,消息ID为10018
LPUSH msg:{诸葛老师-ID} 10018
2)备胎说车发微博,消息ID为10086
LPUSH msg:{诸葛老师-ID} 10086
3)查看最新微博消息
LRANGE msg:{诸葛老师-ID} 0 4

set集合的使用

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中

Set的使用场景,比我我们经常使用小程序抽奖
微信抽奖小程序
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}
    在这里插入图片描述

集合的操作
set1={a,b,c}
set2={b,c,d}
set3={c,d,e}

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

集合操作实现微博微信关注模型
朋友圈的微关系
这边我指的是小一,查看小二的朋友圈

  1. 小一关注的人:
    小一Set-> {小三, 小六}
  2. 小二关注的人:
    小二Set–> {小一, 小五, 小三, 小六}
  3. 小三关注的人:
    小三Set-> {小一, 小二, 小五, 小六, 小九)
  4. 我和小二共同关注:
    SINTER 小一Set 小二Set–> {小三, 小六}
  5. 我关注的人也关注他(小二):
    SISMEMBER 小三Set 小二
    SISMEMBER 小六Set 小二
  6. 我可能认识的人:
    SDIFF 小二Set 小一Set->(小一, 小五}
    在这里插入图片描述

zset 命令行使用,这个比较特殊底层实际上是help @sorted_set

可以使用命令进行压测(对于redis来说每秒效率非常的高,可以达到14万多,主要跟自己电脑的性能也有关系)

[root@localhost redis-5.0.3]# src/redis-benchmark get
====== get ====== 100000 requests completed in 0.68 seconds 50 parallel clients 3 bytes payload keep alive: 1

99.95% <= 1 milliseconds
100.00% <= 1 milliseconds
146627.56 requests per second

命令

[root@localhost redis-5.0.3]# src/redis-benchmark -h
-h Server hostname (default 127.0.0.1)
-p Server port (default 6379)
-s Server socket (overrides host and port)
-a Password for Redis Auth
-c Number of parallel connections (default 50)
-n Total number of requests (default 100000)
-d Data size of SET/GET value in bytes (default 3)
–dbnum SELECT the specified db number (default 0)
-k 1=keep alive 0=reconnect (default 1)
-r Use random keys for SET/GET/INCR, random values for SADD
Using this option the benchmark will expand the string rand_int
inside an argument with a 12 digits number in the specified range
from 0 to keyspacelen-1. The substitution changes every time a command
is executed. Default tests use this to hit random keys in the
specified range.
-P Pipeline requests. Default 1 (no pipeline).
-e If server replies with errors, show them on stdout.
(no more than 1 error per second is displayed)
-q Quiet. Just show query/sec values
–csv Output in CSV format
-l Loop. Run the tests forever
-t Only run the comma separated list of tests. The test
names are the same as the ones produced as output.
-I Idle mode. Just open N idle connections and wait.

如果编写中有问题,希望可以进行留言评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值