02-redis应用
发步和订阅
发布者:发布消息
订阅者:得到订阅的发布者发布的消息
redis客户端可以订阅任意多的频道
使用subscribe
订阅频道和publish
发布频道
客户端A订阅一个channel1:
另一个客户端B发布内容:
客户端A收到消息:
redis6新的数据类型
Bitmaps
Bitmaps本身是一个字符串,可以对字符串进行位操作
setbit <key> <offset> <value> # 设置偏移量offset位置的值为value
getbit <key> <offset> # 取偏移量offset处的值
bitcount <start> <end> # 统计值为1的bit数,默认统计整个字符串,可设置开始和结束位置
bitop and/or/not/xor k [k1 k2 ...] # 进行与或非和异或等操作,结果存到k
注意:offset的偏移从0开始
HyperLogLog
HyperLogLog只会根据输入元素计算基数,不会存储输入元素
比如这样一个集[1,1,2,2,3,3],他的集合是{1,2,3},基数为3
pfadd <key> v1 v2... # 加入一组元素
pfcount k # 近似计算基数
pfmerge k1 k2 k3... # 把后面的基数合并到k1中
Geographic
地理信息,也就是元素的2维坐标,也就是经纬度
geoadd k 经度 纬度 地理名 # 添加一个地理位置的经纬度
geopos k 地理名 # 获取地理位置的经纬度
geodist k 地理1 地理2 单位# 得到两个位置间的直线距离
georadius k 经度 纬度 半径 # 取某个位置半径内的地理位置
Jedis
使用java操作redis的工具,先导入依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
外部连接redis服务器,要修改一些默认配置:
- 修改bind属性,直接注释掉
- 设置protected-mode为no
- 使用阿里云的话,记得去服务器打开对应端口
使用jedis方法:
-
获取jedis对象
Jedis jedis = new Jedis(url,port);
-
进行各种操作,比如存值取值等,下面就是存一个List然后取出来的操作
jedis.lpush("myList","dog","cat","cow","tiger"); List<String> list = jedis.lrange("myList",0,-1);
基于Jedis的手机验证码案例
要求:
- 输入手机号,随机生成6位数字,2分钟内有效
- 输入验证码进行验证
- 每个手机只能申请发送3次
思路:
- 生成的数字放到redis,设置2min过期时间
- 从redis中取出来进行验证
- 把手机号也存入redis,每次发送incr,大于2则不能发送
public class JedisPhone {
public static void main(String...args){
JedisPhone phone = new JedisPhone();
phone.sendCode("18982137871");
System.out.println(phone.checkCode("18982137871","288308"));
}
// 1. 发送手机的验证码
public void sendCode(String phone){
String countKey = "Count:"+ phone;
Jedis jedis = new Jedis("XXX",6379); //ip地址保密
String count = jedis.get(countKey);
if(count == null){
jedis.set(countKey, String.valueOf(0));
}else if(Integer.parseInt(count) <=1){ //null->0->1
jedis.incr(countKey);
}else{
System.out.println("发送次数已达到上限");
}
String codeKey = "Code:" + phone;
StringBuilder code = new StringBuilder("");
Random random = new Random();
for (int i=0; i<6; i++){
int temp = random.nextInt(10);
code.append(temp);
}
jedis.set(codeKey, code.toString());
jedis.close();
}
// 2. 输入验证码进行验证
public boolean checkCode(String phone, String code){
Jedis jedis = new Jedis("xxx",6379); //ip地址保密
String codeKey = "Code:" + phone;
if(code.equals(jedis.get(codeKey))){
jedis.close();
return true;
}
jedis.close();
return false;
}
}