
导读:redis允许客户端以TCP方式连接,默认6379端口。传输数据都以\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方法 输出两个参数
再新建一个项目 去发布消息 可以看到订阅了的可以收到消息。




















.jpg)

.jpg)

.jpg)

.jpg)


.jpg)






.jpg)


