查看redis有哪些客户端连接

客户 0 87

查看redis有哪些客户端连接,第1张

查看redis有哪些客户端连接
导读:redis允许客户端以TCP方式连接,默认6379端口。传输数据都以\r\n结尾。请求格式\r\n$\r\n

redis允许客户端以TCP方式连接,默认6379端口。传输数据都以\r\n结尾。请求格式<number of arguments>\r\n$<number of bytes of argument 1>\r\n<argument data>\r\n例:1\r\n$4\r\nINFO\r\n响应格式1:简单字符串,非二进制安全字符串,一般是状态回复。 +开头,例:+OK\r\n 2: 错误信息。          -开头, 例:-ERR unknown command 'mush'\r\n3: 整型数字。 :开头, 例::1\r\n4:大块回复值,最大512M。 $开头+数据长度。 例:$4\r\mush\r\n5:多条回复。 开头, 例:2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n基础通信定义配置类: public class Configuration { public string Host { get; set; } public int Port { get; set; } /// <summary> /// Socket 是否正在使用 Nagle 算法。 /// </summary> public bool NoDelaySocket { get; set; }public Configuration() { Host = "localhost"; Port = 6379; NoDelaySocket = false; } }实现socket连接:public class RedisBaseClient { //配置文件 private Configuration configuration; //通信socket private Socket socket; //接收字节数组 private byte[] ReceiveBuffer = new byte[100000]; public RedisBaseClient(Configuration config) { configuration = config; } public RedisBaseClient() : this(new Configuration()) { } public void Connect() { if (socket != null && socketConnected) return; socket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp) { NoDelay = configurationNoDelaySocket }; socketConnect(configurationHost, configurationPort); if (socketConnected) return; Close(); } /// <summary> /// 关闭client /// </summary> public void Close() { socketDisconnect(false); socketClose(); } }调用:RedisBaseClient redis = new RedisBaseClient(); redisConnect();服务端成功响应:  状态命令定义Redis命令枚举:public enum RedisCommand { GET, //获取一个key的值 INFO, //Redis信息。 SET, //添加一个值 EXPIRE, //设置过期时间 MULTI, //标记一个事务块开始 EXEC, //执行所有 MULTI 之后发的命令 }发送命令构建:public string SendCommand(RedisCommand command, params string[] args) { //请求头部格式, <number of arguments>\r\n const string headstr = "{0}\r\n"; //参数信息 $<number of bytes of argument N>\r\n<argument data>\r\n const string bulkstr = "${0}\r\n{1}\r\n"; var sb = new StringBuilder(); sbAppendFormat(headstr, argsLength + 1); var cmd = commandToString(); sbAppendFormat(bulkstr, cmdLength, cmd); foreach (var arg in args) { sbAppendFormat(bulkstr, argLength, arg); } byte[] c = EncodingUTF8GetBytes(sbToString()); try { Connect(); socketSend(c); socketReceive(ReceiveBuffer); Close(); return ReadData(); } catch (SocketException e) { Close(); } return null; } private string ReadData() { var data = EncodingUTF8GetString(ReceiveBuffer); char c = data[0]; //错误消息检查。 if (c == '-') //异常处理。 throw new Exception(data); //状态回复。 if (c == '+') return data; return data; }

JPush SDK 收到推送,通过广播的方式,转发给开发者App,这样开发者就可以灵活地进行处理。

这个动作不是必须的。用户有需要才定义 Receiver 类来处理 SDK过来的广播。

如果不做这个动作,即不写自定义 Receiver,也不在 AndroidManifestxml 里配置这个 Receiver,则默认的行为是:

接收到推送的自定义消息,则没有被处理

可以正常收到通知,用户点击打开应用主界面

接受广播

如果全部类型的广播都接收,则需要在 AndroidManifestxml 里添加如下的配置信息:

<receiver

android:name="Your Receiver"

android:enabled="true">

<intent-filter>

<action android:name="cnjpushandroidintentREGISTRATION" />

<action android:name="cnjpushandroidintentMESSAGE_RECEIVED" />

<action android:name="cnjpushandroidintentNOTIFICATION_RECEIVED" />

<action android:name="cnjpushandroidintentNOTIFICATION_OPENED" />

<category android:name="You package Name" />

</intent-filter>

</receiver>

Redis应该说是目前最受欢迎的NoSQL数据库之一了。Redis通常被作为缓存组件,用作缓存数据。不过,除了可以缓存数据,其实Redis可以做的事还有很多。下面列举几例,供大家参考。

1、最新列表

例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。不过万一内存清掉了咋办? (推荐学习:Redis视频教程)

也简单,查询不到存储key的话,用mysql查询并且初始化一个List到redis中就好了。

2、排行榜应用

实现这个功能主要用到的redis数据类型是redis的有序集合zset。zset 是set 类型的一个扩展,比原有的类型多了一个顺序属性,此属性在每次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列。

我们假设是一个游戏经验值排行榜,那主要的实现思路是:

1、在一个新的玩家参与到游戏中时,在redis中的zset中新增一条记录(记录内容看具体的需求)score为0

2、当玩家的经验值发生变化时,修改该玩家的score值

3、使用redis的ZREVRANGE方法获取排行榜

3、计数器应用

Redis的命令都是原子性的,你可以轻松地利用INCR、DECR命令进行原子性操作,来构建计数系统。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能。

比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。

4、数据排重

Redis set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口。

实现方案:

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

5、实时的反垃圾系统

反垃圾系统通常都是基于关键词的,使用Redis储存关系词,能够利用Redis的高性能,为监控系统提供稳定及精确的实时监控功能,典型的案例如,邮件系统、评论系统等。

6、可以发布、订阅的实时消息系统

Redis中Pub/Sub系统可以构建实时的消息系统,比如,很多使用Pub/Sub构建的实时聊天应用。

设计思路:

服务端发送消息(含标题,内容),标题按照一定规则存入redis,同时标题(以最少的信息量)推送到客户端,客户点击标题时,获取相应的内容阅读

如果未读取,可以提示多少条未读,redis能够很快记数

根据一定时间清理缓存

技术实现:

需要redis数据库,客户端websocket,服务器端websocket

7、队列应用

队列在现在程序中应用十分广泛,比如日志推送、任务处理等等。以往通常使用http sqs实现队列,其实,使用redis的list类型,也可以实现队列。

更多Redis相关技术文章,请访问Redis数据库使用入门教程栏目进行学习!

1

开启redis服务器,我的redis在D盘因此cmd重复开启多个redis客户端

D:

cd D:\Redis

redis-cliexe -h 127001 -p 6379

2

模拟订阅频道

subscribe channe1 [channel ] 监听某一频道

subscribe java

3

再开一个redis客户端模拟发布消息

d:

cd D:\Redis

redis-cliexe -h 127001 -p 6379

publish java woyongyuanaijava

此时可以看到两个订阅了频道的客户端均能收到消息

在jedis封装好的方法中很明显的就可以看到对应的类

点进去看JedisPubSub类的源码

可以看到是一个抽象类 方法空实现 那就根据方法名来试一下吧

新建一个类去继承JedisPubSub类 重写onMessage方法 输出两个参数

再新建一个项目 去发布消息 可以看到订阅了的可以收到消息。