redis安装,启动,5种数据结构的基本使用

一. 安装并启动redis

1.打开需要下载redis的目录
mkdir packages
cd packages/
2. 下载redis安装包
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
ls -lrt
3. 解压安装包
tar xzfv redis-5.0.3.tar.gz 
cd redis-5.0.3/
ls -lrt
4. 安装
make
pwd
ls -lrt
5. 启动redis服务端
src/redis-server redis.conf &
6. 查看服务启动起来了吗
 ps -ef| grep redis
7. 启动redis客户端
scr/redis-cli
8. 简单的使用实例

[allen@localhost redis-5.0.3]$ src/redis-cli
127.0.0.1:6379> set allen "will win 100 million yuan this year"
OK
127.0.0.1:6379> get allen
"will win 100 million yuan this year"
127.0.0.1:6379> 

如何查看官网文档:

在client端,如何获取帮助文档:

127.0.0.1:6379> help @set

  SADD key member [member ...]
  summary: Add one or more members to a set
  since: 1.0.0

命令简介(基于功能)

1. 单值缓存。

2. 对象缓存

Name Balance
Allen 200000
Bill 4000
Carlyn 30000
David 70000

方式一:

 Set user:1 value (Json格式数据)

方式二:

 mset user:1:Name Allen user:1:Balance 200000

127.0.0.1:6379> mset user:1:Name Allen user:1:Balance 200000
OK
127.0.0.1:6379> mset user:2:Name Bill user:2:Balance 40000
OK
127.0.0.1:6379> mget user:1:Name
1) "Allen"
127.0.0.1:6379> mget user:1:Balance
1) "200000"

3. setNX实现分布式锁

 NX -- Only set the key if it does not already exist.

返回1表示设置成功,返回0表示设置失败,执行完成删除key即释放锁

127.0.0.1:6379> SETNX product:1001 true
(integer) 1
127.0.0.1:6379> SETNX product:1001 true
(integer) 0
127.0.0.1:6379> del product:1001
(integer) 1

4. 使用incr来实现阅读量功能 

127.0.0.1:6379> incr artical:readCount:1001
(integer) 1
127.0.0.1:6379> incr artical:readCount:1001
(integer) 2
127.0.0.1:6379> incr artical:readCount:1001
(integer) 3
127.0.0.1:6379> 

5. Redis hash常用操作

redis hash数据结构实现对象存储,Hmset

127.0.0.1:6379> hmset user 1001:name Allen 1001:balence 1000000
OK
127.0.0.1:6379> hmset user 1002:name Sky 1002:balence 10000
OK
127.0.0.1:6379> hgetall user
1) "1001:name"
2) "Allen"
3) "1001:balence"
4) "1000000"
5) "1002:name"
6) "Sky"
7) "1002:balence"
8) "10000"
127.0.0.1:6379> hmget user 1001:name
1) "Allen"
127.0.0.1:6379> 

5.1. redis hash数据结构实现对象存储,Hset

hash用来增加购物车的场景:

1) 一用户id为key - cart:1001

2) 以商品id为field字段 - 8808

3) 以商品数量为value - 1

127.0.0.1:6379> hset cart:1001 8808 1
(integer) 1
127.0.0.1:6379> hincrby cart:1001 8808 1
(integer) 2
127.0.0.1:6379> hlen cart:1001
(integer) 1
127.0.0.1:6379> hget cart:1001 8808
"2"
127.0.0.1:6379> hgetall cart:1001
1) "8808"
2) "2"
127.0.0.1:6379> 

6. list数据结构实现数据结构

6.1 栈数据结构的实现,

Stack (栈 FILO) = LPUSH + LPOP

127.0.0.1:6379> LPUSH menu "Pai HuangGua"
(integer) 1
127.0.0.1:6379> LPUSH menu "Shao Zhuti"
(integer) 2
127.0.0.1:6379> LPUSH menu "Zheng Xiongzhang"
(integer) 3
127.0.0.1:6379> LPOP menu
"Zheng Xiongzhang"
127.0.0.1:6379> LPOP menu
"Shao Zhuti"
127.0.0.1:6379> 

6.2 队列数据结构的实现:

Queue(队列 FIFO) = LPUSH + RPOP

127.0.0.1:6379> LPUSH QueueMenu "Pai HuangGua"
(integer) 1
127.0.0.1:6379> LPUSH QueueMenu "Shao ZhuTi"
(integer) 2
127.0.0.1:6379> LPUSH QueueMenu "Zhen XiongZhang"
(integer) 3
127.0.0.1:6379> RPOP QueueMenu
"Pai HuangGua"
127.0.0.1:6379> RPOP QueueMenu
"Shao ZhuTi"
127.0.0.1:6379> 

6.2 阻塞队列数据结构的实现

Blocking Queue(队列 FIFO) = LPUSH + BRPOP

127.0.0.1:6379> LPUSH QueueMenu "Pai HuangGua"
(integer) 1
127.0.0.1:6379> LPUSH QueueMenu "Shao ZhuTi"
(integer) 2
127.0.0.1:6379> BRPOP QueueMenu 5
1) "QueueMenu"
2) "Pai HuangGua"
127.0.0.1:6379> BRPOP QueueMenu 5
1) "QueueMenu"
2) "Shao ZhuTi"
127.0.0.1:6379> BRPOP QueueMenu 5
(nil)
(5.10s)
127.0.0.1:6379> 

6.3 LRANGE 命令的使用

127.0.0.1:6379> LPUSH QueueMenu "Zhen XiongZhang"
(integer) 1
127.0.0.1:6379> LPUSH QueueMenu "Shao ZhuTi"
(integer) 2
127.0.0.1:6379> LPUSH QueueMenu "Pai HuangGua"
(integer) 3
127.0.0.1:6379> LPUSH QueueMenu "Chao HuaSheng"
(integer) 4
127.0.0.1:6379> LPUSH QueueMenu "Kao Ya"
(integer) 5
127.0.0.1:6379> LRange QueueMenu 2 4
1) "Pai HuangGua"
2) "Shao ZhuTi"
3) "Zhen XiongZhang"
127.0.0.1:6379> 

7. Set数据结构应用场景

7.1.  抽奖,每次同一个员工可以多次中奖

127.0.0.1:6379> sadd choujinag Allen
(integer) 1
127.0.0.1:6379> sadd choujinag Bill
(integer) 1
127.0.0.1:6379> sadd choujinag Fiona
(integer) 1
127.0.0.1:6379> sadd choujinag Wesley
(integer) 1
127.0.0.1:6379> sadd choujinag Alisa
(integer) 1
127.0.0.1:6379> sadd choujinag Mocha
(integer) 1
127.0.0.1:6379> srandmember choujinag 2
1) "Fiona"
2) "Bill"
127.0.0.1:6379> SMEMBERS choujinag
1) "Wesley"
2) "Mocha"
3) "Alisa"
4) "Fiona"
5) "Bill"
6) "Allen"

7.2 抽奖,同一个员工只能中一次奖

127.0.0.1:6379> SPOP choujinag 2
1) "Wesley"
2) "Fiona"
127.0.0.1:6379> SMEMBERS choujinag
1) "Mocha"
2) "Alisa"
3) "Bill"
4) "Allen"
127.0.0.1:6379> 

7.3 set实现like(点赞)功能

点赞  -> 取消点赞->check 是否点赞 -> 查看点赞列表-> 查看点赞数

127.0.0.1:6379> sadd like:Message1001 Allen
(integer) 1
127.0.0.1:6379> sadd like:Message1001 Bill
(integer) 1
127.0.0.1:6379> sadd like:Message1001 Fiona
(integer) 1
127.0.0.1:6379> sadd like:Message1001 Mocha
(integer) 1
127.0.0.1:6379> srem like:Message1001 Fiona
(integer) 1
127.0.0.1:6379> SISMEMBER like:Message1001 Bill
(integer) 1
127.0.0.1:6379> SISMEMBER like:Message1001 Fiona
(integer) 0
127.0.0.1:6379> SMEMBERS like:Message1001
1) "Bill"
2) "Allen"
3) "Mocha"
127.0.0.1:6379> scard like:Message1001
(integer) 3
127.0.0.1:6379> 

7.4 集合的运算

并集  -- SINTER

或集  -- SUNION

差集  --SDIFF - 用第一个集合减去后面所有的集合

127.0.0.1:6379> sadd fruit1 apple banana
(integer) 2 
127.0.0.1:6379> sadd fruit2 pear berry grape apple orange
(integer) 2
127.0.0.1:6379> sadd fruit3 apple mongo
(integer) 2
127.0.0.1:6379> SINTER fruit1 fruit2
1) "apple"
127.0.0.1:6379> SUNION fruit3 fruit1
1) "banana"
2) "apple"
3) "mongo"
127.0.0.1:6379> sdiff fruit1 fruit2
1) "banana"
127.0.0.1:6379> 

电商网站上筛选解决方案:

8. 有序集合zset

zset的操作命令


以上命令的简单使用:

127.0.0.1:6379> zadd MathScore 90 allen 80 bill 65 mocha 85 fiona
(integer) 4
127.0.0.1:6379> ZREM MathScore mocha
(integer) 1
127.0.0.1:6379> zscore MathScore mocha
(nil)
127.0.0.1:6379> zscore MathScore fiona
"85"
127.0.0.1:6379> zcard MathScore 
(integer) 3
127.0.0.1:6379> ZRANGE MathScore 1 2
1) "fiona"
2) "allen"
127.0.0.1:6379> ZRANGE MathScore 1 2 withscores
1) "fiona"
2) "85"
3) "allen"
4) "90"
127.0.0.1:6379> ZREVRANGE MathScore 0 2
1) "allen"
2) "fiona"
3) "bill"
127.0.0.1:6379> zadd EnglishScore 100 allen 80 sky 70 kevin
(integer) 3
127.0.0.1:6379> ZINCRBY MatchScore 1 fiona
"86"
127.0.0.1:6379> ZINCRBY MatchScore 1 fiona
"87"
127.0.0.1:6379> ZINCRBY MatchScore 1 fiona
"88"
127.0.0.1:6379> ZUNIONSTORE Class061Score 2 MatchScore EnglishScore
(integer) 5
127.0.0.1:6379> ZREVRANGE Class061Score 0 4 withscores
 1) "allen"
 2) "190"
 3) "fiona"
 4) "88"
 5) "sky"
 6) "80"
 7) "bill"
 8) "80"
 9) "kevin"
10) "70"

9. 其他高级命令,列出所有的key

keys *

keys allen

127.0.0.1:6379> keys *
 1) "menu"
 2) "user:1:Balance"
 3) "user:1:Name"
 4) "QueueMenu"
 5) "fruit1"
 6) "choujinag"
 7) "EnglishScore"
 8) "artical:readCount:1001"
 9) "fruit3"
10) "Class061Score"
11) "user:2:Balance"
12) "cart:1001"
13) "like:Message1001"
14) "MatchScore"
15) "fruit2"
16) "user"
17) "user:2:Name"
18) "allen"
127.0.0.1:6379> keys allen
1) "allen"

使用keys 去统计扫描整个redis,会导致block

10. 渐进式遍历,一直扫描直到返回的值为游标0.

这里的游标就是hash map中的桶的下表值。

scan 0 match user* count 3

127.0.0.1:6379> keys user*
1) "user:1:Balance"
2) "user:1:Name"
3) "user1"
4) "user:2:Balance"
5) "user3"
6) "user2"
7) "user"
8) "user:2:Name"
127.0.0.1:6379> scan 0 match user* count 3
1) "20"
2) 1) "user:1:Name"
127.0.0.1:6379> scan 20 match user* count 3
1) "28"
2) 1) "user:2:Balance"
127.0.0.1:6379> scan 28 match user* count 3
1) "30"
2) 1) "user1"
127.0.0.1:6379> scan 30 match user* count 3
1) "13"
2) 1) "user"
   2) "user:2:Name"
   3) "user3"
127.0.0.1:6379> scan 13 match user* count 3
1) "19"
2) 1) "user:1:Balance"
127.0.0.1:6379> scan 19 match user* count 3
1) "31"
2) 1) "user2"
127.0.0.1:6379> scan 31 match user* count 3
1) "0"
2) (empty list or set)
127.0.0.1:6379> 

猜你喜欢

转载自blog.csdn.net/pengweismile/article/details/112093565