快速学习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]
微信微博点赞,收藏,标签
- 点赞
SADD like:{消息ID} {用户ID} - 取消点赞
SREM like:{消息ID} {用户ID} - 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID} - 获取点赞的用户列表
SMEMBERS like:{消息ID} - 获取点赞用户数
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 }
集合操作实现微博微信关注模型
朋友圈的微关系
这边我指的是小一,查看小二的朋友圈
- 小一关注的人:
小一Set-> {小三, 小六} - 小二关注的人:
小二Set–> {小一, 小五, 小三, 小六} - 小三关注的人:
小三Set-> {小一, 小二, 小五, 小六, 小九) - 我和小二共同关注:
SINTER 小一Set 小二Set–> {小三, 小六} - 我关注的人也关注他(小二):
SISMEMBER 小三Set 小二
SISMEMBER 小六Set 小二 - 我可能认识的人:
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: 199.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.
如果编写中有问题,希望可以进行留言评论