您的当前位置:首页正文

【Linux服务器开发】2.5 Redis编程-操作-消息队列机制-发布订阅

2023-05-13 来源:爱站旅游
导读【Linux服务器开发】2.5 Redis编程-操作-消息队列机制-发布订阅

目录


1.Redis安装

2.基本数据结构

2.0 key

redis中的key可以是long,double,int,string类型的,但最终都存储为string类型.

2.1 字符串String

2.1.1 简单的字符串

2.1.2 MSET批量设置可以提高吞吐量

set student Amy

set student Bob

setnx student Cindy(报错)

2.2 哈希Hash

2.2.1 命令

序号  命令及描述
1     HDEL key field1 [field2]         删除一个或多个哈希表字段
2     HEXISTS key field                查看哈希表 key 中,指定的字段是否存在。
3     HGET key field                   获取存储在哈希表中指定字段的值。
4     HGETALL key                      获取在哈希表中指定 key 的所有字段和值
5     HINCRBY key field increment      为哈希表key中的指定字段的整数值加上增量 increment 。
6     HINCRBYFLOAT key field increment 为哈希表key中的指定字段的浮点数值加上增量 increment 。
7     HKEYS key                        获取所有哈希表中的字段,数据量大(生产环境)不要用,会阻塞线程
8     HLEN key                         获取哈希表中字段的数量
9     HMGET key field1 [field2]        获取所有给定字段的值
10    HMSET key field1 value1 [field2 value2 ]同时将多个field-value(域-值)对设置到哈希表key中
11    HSET key field value            将哈希表key中的字段field的值设为value
12    HSETNX key field value          只有在字段field不存在时,设置哈希表字段的值
13    HVALS key                                       获取哈希表中所有值
14    HSCAN key cursor [MATCH pattern] [COUNT count]  迭代哈希表中的键值对

hset article:10086 name FemaleRights author Muten

hget article:10086 name

hget article:10086 author

2.2.2 应用举例

           2.2.2.1 短网址生成程序

           2.2.2.2 使用散列表重新实现文章存储

2.2.3 散列表和字符串的命令比较

2.3 列表List

一般来说是左变边插入数据右边出来的.

2.4 Set

集合的元素是唯一的.

2.4.1 实例图示

 

2.5 Sorted Set

序号  命令及描述
1  ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2  ZCARD key 获取有序集合的成员数
3  ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
4  ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
5  ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
零声学院版权所有
King 老师 QQ: 3147964070
6  ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
7  ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员
8  ZRANGEBYLEX key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
9  ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
10  ZRANK key member
返回有序集合中指定成员的索引
11  ZREM key member [member ...]
移除有序集合中的一个或多个成员
12  ZREMRANGEBYLEX key min max
移除有序集合中给定的字典区间的所有成员
13  ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
14  ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
15  ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到底
16  ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
17  ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18  ZSCORE key member
返回有序集中,成员的分数值
19  ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20  ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成员和元素分值)
127.0.0.1:6379> zadd LanguageRank 1 C
(integer) 1
127.0.0.1:6379> zadd LanguageRank 3 Java
(integer) 1
127.0.0.1:6379> zadd LanguageRank 2 CPP
(integer) 1
127.0.0.1:6379> zadd LanguageRank 4 Python
(integer) 1
127.0.0.1:6379> zrange LanguageRank 0 10
1) "C"
2) "CPP"
3) "Java"
4) "Python"

2.6 Hyper LogLog

2.7 数据结构之间的比较与一些场景选型说明

论坛不要用list来做,有人回帖了要更新到前面去,

(1)先把对应id从list中删除,时间复杂度是n;

(2)再把id重新lpush,这个时候才能到最前面.

通过(1)(2)两步知道这个是非常不好的.

此时可以考虑用有顺序的SortedSet

3.其他功能介绍

3.1 发布订阅

客户端5在客户端4在redisChat频道发布两次消息之后订阅了redisChat,redisChat2和redisChat3这三个频道,然后收到了redisChat频道和redisChat2频道的消息.

3.2 事务

3.2.1 使用方法与命令

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
1> 批量操作在发送 EXEC 命令前被放入队列缓存。
2> 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
3> 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
1> 开始事务。
2> 命令入队。
3> 执行事务

redis 事务的相关命令:
DISCARD-取消事务,放弃执行事务块内的所有命令
EXEC-执行所有事务块内的命令
MULTI-标记一个事务块的开始
UNWATCH-取消WATCH命令对所有key的监视
WATCH key [key ...]-监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,
那么事务将被打断.

3.2.1 注意事项

因为事务在执行时会独占服务器,所以用户应该避免在事务中执行过多命令,更不要将一些需要进
行大量计算的命令放入事务中,以免造成服务器阻塞.

3.3 数据备份与恢复

持久化方式有RDB和AOF两种方式.

RDB方式的会fork一个子进程将key-value全部赋值到硬盘.子进程采用写时复制的技术.

3.4 性能测试

3.5 客户端连接

3.6 管道道济

3.7 分区

4.其他常用命令介绍

redis-cli -h 127.0.0.1 -p 6379  登录进入客户端(默认不用输入密码)

quit 退出客户端

FLUSHALL 删除所有数据库里面的所有数据,注意不是当前数据库,而是所有数据库

KEYS key 获取所有的key值

HKEY key 获取所有的key值

5.C语言使用 Redis

/home/muten/module/redis-6.0.9/deps/hiredis

gcc -o hiredis-test 002-hiredis-test.c -I /usr/local/include/hiredis -L /usr/local/lib -lhiredis

/usr/local/lib/libhiredis.so

测试代码路径:/home/muten/module/my-redis-learning/002-hiredis-test.c

git add 002-hiredis-test.c

git commit -m "submit 002-hiredis-test.c"

git push

6.工具,配置,脚本等说明

6.1 抓包分析工具tcpdump

tcpdump -i any dst host 127.0.0.1 and port 6379

tcpdump -i any dst host 127.0.0.1 and port 6379 -XX

6.2 lsof查看进程开打的文件(root权限才可)

6.3 服务启动的配置文件

/home/muten/module/redis-6.0.9/redis.conf(与/etc/redis/6379.conf一样)中的protected-mode的值为yes的时候可允许远程进行访问.

6.4 启动脚本

/home/muten/module/redis-6.0.9/utils/redis_init_script(启动脚本,与/etc/init.d/redis_6379是一样的)

7.学习链接与问题

7.1 学习链接

7.2 问题

7.2.1 centos下如何看哪些命令是开机启动的?

7.2.2 redis的安全怎么保证?

一般redis是搭建在企业集群的内部的,是不会开放给外面的.

7.2.3 redis使用的是自定义的应用层协议吗?传输层用的什么协议?

是的,redis的应用层协议是自定义的,传输层的协议是TCP协议.

7.2.4 redis的协议时怎么设计的?

因篇幅问题不能全部显示,请点此查看更多更全内容