目录
Redis可视化工具_安装Redis_Desktop_Manager
StringRedisTemplate与RedisTemplate
Redis数据类型_Bitmaps
简介
在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。 例如 "abc" 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是 97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:
合理地使用位能够有效地提高内存使用率和开发效率。
Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:
常用命令
setbit
设置Bitmaps中某个偏移量的值。
语法结构:
setbit key offset value
示例:
redis中bitmaps可以用来统计用户信息,eg:活跃天数、打卡天数、登录天数 bitmaps位图,都是操作二进制来进行记录,就只有0和1两个状态
127.0.0.1:6379> getbit sign 1 # 获取第一天的打卡状态 (integer) 1 127.0.0.1:6379> BITCOUNT sign # 统计所有打卡天数 (integer) 4127.0.0.1:6379> setbit zhangsan:3 1 1 # 往sign中添加数据,第1天打卡 (integer) 1 127.0.0.1:6379> setbit zhangsan:3 2 0 # 第2天未打卡 (integer) 0 127.0.0.1:6379> setbit zhangsan:3 3 1 # 第3天打卡 (integer) 0 127.0.0.1:6379> setbit zhangsan:3 4 0 # 第4天未打卡 (integer) 0 127.0.0.1:6379> setbit zhangsan:3 5 1 # 第5天打卡 (integer) 0 127.0.0.1:6379> setbit zhangsan:3 6 0 # 第6天未打卡 (integer) 0 127.0.0.1:6379> setbit zhangsan:3 7 1 # 第7天打卡 (integer) 0 127.0.0.1:6379> getbit sign 1 # 获取第一天的打卡状态 (integer) 1 127.0.0.1:6379> BITCOUNT sign # 统计所有打卡天数 (integer) 4 127.0.0.1:6379> getbit sign 1 # 获取第一天的打卡状态 (integer) 1
getbit
获取Bitmaps中某个偏移量的值。
语法结构:
getbit key offset
示例:获取key的offset 的值。
getbit sign 3 获取偏移量为1的值,结果为1
如果偏移量未设置值,则也返回0。
getbit sign 99 获取偏移量为99的值,结果为0
bitcount
统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会被进行统计,可以选择通过额外 的start和end参数,指定字节组范围内进行统计(包括start和end),0表示第一个元素,-1表示最后一 个元素。
语法结构:
bitcount key [start end]
示例:
bitcount sign 获取整个字符串被设置为1的bit数量,结果为3
如:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对应 [1,1,2,3]。
setbit num 7 1 setbit num 15 1 setbit num 22 1 setbit num 30 1 setbit num 31 1 bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中bit=1的数 量,结果为2 bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计 00000001,00000010,00000011中bit=1的数量,结果为4 bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5
setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。
bitop
将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。
语法结构:
bitop and/or destkey sourcekey1 sourcekey2……
示例:
bitop and k3 k1 k2 通过求交集将k1 k2合并成k3 bitop or k3 k1 k2 通过求并集将k1 k2合并成k3
实时学习反馈
1. Redis技术Bitmaps数据类型中如何设置Bitmaps中某个偏移量的值。
A setbit
B getbit
C bitcount
D bitop
2. Redis技术Bitmaps数据类型中如何获取Bitmaps中某个偏移量的值。
A setbit
B getbit
C bitcount
D bitop
Redis数据类型_Geospatia
简介
GEO,Geographic,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该 类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。
常用命令
geoadd
用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称 (member)添加到指定的 key 中。
语法结构:
geoadd key longitude latitude member
示例:
# 将北京的经纬度和名称添加到china geoadd china 116.405285 39.904989 beijing # 将成都和上海的经纬度、名称添加到china geoadd china 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai
geopos
从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
语法结构:
geopos key member [member ……]
示例:返回china中名称为shanghai和beijing的经纬度
geopos chinacity shanghai beijing
geodist
用于返回两个给定位置之间的距离。
语法结构:
geodist key member1 member2 [m|km|ft|mi]
示例:
# 返回shanghai和beijing之间的距离,结果1067597.9668,单位米 geodist chinacity shanghai beijing # 返回shanghai和chengdu之间的距离,结果1660.0198,单位是千米 geodist chinacity shanghai chengdu km
georadius
以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给 定最大距离(radius )的所有位置元素。
语法结构:
georadius key longitude latitude radius m|km|ft|mi
示例:
#获取经纬度110 30为中心,在china内1200公里范围内的所有元素。 georadius china 110 30 1200 km
实时学习反馈
1. Redis技术Geospatia数据类型中如何存储指定的地理空间位置。
A geoadd
B geopos
C geodist
D georadius
2. Redis技术Geospatia数据类型中如何计算两个给定位置之间的距离。
A geoadd
B geopos
C geodist
D georadius
Redis数据类型_Hyperloglog
简介
在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view)。redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者 体积非常非常大时,计算基数所需的空间总是固定的、并且使很小的。
什么是基数
比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5.基数估计就是在 误差可接受的范围内,快速计算基数。
常用命令
pfadd
将所有元素参数添加到 Hyperloglog 数据结构中。
语法结构:
pfadd key element1 element2……
示例:
如果至少有个元素被添加返回 1, 否则返回 0。
pfadd book1 uid1 uid2 uid
注意:
添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0。
pfcount
计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。
语法结构:
pfcount key1 key2……
示例:
pfcount book1 #计算book1的基数,结果为3 pfadd book2 uid3 uid4 #添加两个元素到book2中 pfcount book1 book2 #统计两个key的基数总数,结果为5
pfmerge
将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。
语法结构:
pfmerge destkey sourcekey1 sourcekey2……
示例:比如每月活跃用户可用每天活跃用户合并后计算。
#将book1和book2合并成book,结果为5 pfmerge book book1 book2
使用场景
基数不大,数据量不大就用不上,会有点大材小用浪费空间,有局限性,就是只能统计基数数量,而没 办法去知道具体的内容是什么,和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmaps 方便很多,一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃。
实时学习反馈
1.Redis HyperLogLog 是用来做____的算法。
A 统计计算
B 分类
C 聚合统计
D 统计基数
Redis可视化工具_安装Redis_Desktop_Manager
下载Redis Desktop Manager
注意: 官网https://rdm.dev/pricing
选择安装路径
连接Redis服务
关闭防火墙
systemctl stop firewalld.service
关闭保护模式
protected-mode no
开启远程访问
redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf。
注释掉bind 127.0.0.1 可以使所有的ip访问redis
配置连接服务
配置信息
Java整合Redis_Jedis操作
什么是Jedis
Jedis是Redis官方推荐的Java连接开发工具。
引入Jedis
创建maven工程
引入maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Jedis连接到redis
//第一个参数是ip地址,第二个参数是端口
Jedis jedis = new Jedis("192.168.56.31",6379);
测试相关数据类型
连接Redis服务
Jedis jedis = new Jedis("192.168.56.31",6379);
//通过ping()方法向redis发送一个ping命令,服务器返回一个Pong
String msg = jedis.ping();
System.out.println(msg);
//jedis使用完毕需要关闭
jedis.close();
Jedis-API:String
//设置一个key
jedis.set("k1","v1");
//设置一个key
jedis.set("k2","1");
//获取一个key
String res = jedis.get("k1");
//对某一个key自增
Long ires = jedis.incr("k2");
Jedis-API:Keys
//返回所有的key
Set<String> keys = jedis.keys("*");
//返回该key剩余过期时间
Long time = jedis.ttl("k1");
Jedis-API:List
//向list中添加数据
jedis.lpush("list1","v1","v2","v3");
//返回list全部数据
List<String> list = jedis.lrange("list1",0,-1 );
Jedis-API:Set
//向set中添加数据
jedis.sadd("set1" ,"v1","v2","v2","v3");
//查看该集合中有多少个元素
jedis.smembers("set1");
Jedis-API:Hash
//设置一个hash
jedis.hset("user","age","25");
//获取该key的所有value
jedis.hvals("user");
Jedis-API:Zset
//向zset中添加一条数据
jedis.zadd("zset1",100,"java");
//获取所有的值
jedis.zrange("zset1",0,-1);
Jedis-API:Bitmaps
//将b1偏移量为0的位设置为1
jedis.setbit("b1",0, "1");
//获取b1偏移量为0的位
jedis.getbit("b1",0);
Jedis-API:Geospatia
//添加一条地理信息数据
jedis.geoadd("chinacity",130,110,"xiaotong");
Jedis-API:Hyperloglog
//将所有元素参数添加到 Hyperloglog 数据结构中。
jedis.pfadd("book","c++","java","php");
Java整合Redis_Spring-Data-Redis
简介
Spring-Data-Redis是spring大家族的一部分,通过简单的配置访问Redis服务,对Reids底层开发包 (Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了Redis各种操作、异常处理及序列化,支持发布订阅。
RedisTemplate介绍
Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。
org.springframework.data.redis.core
Class RedisTemplate<K,V>
RedisTemplate中定义了对5种数据结构操作
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
StringRedisTemplate与RedisTemplate
pom.xml添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
在application.properties中配置
#Redis服务器连接地址
spring.redis.host=192.168.56.31
#Redis服务器连接端口
spring.redis.port=6379
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000
自定义序列化
/**
* 自定义序列化方式
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
使用redisTemplate进行各类型的CURD操作
String数据类型操作
添加元素
public boolean set(String key,Object value){
try{
redisTemplate.opsForValue().set(key,value);
return true;
}catch (Exception e){
log.error("redis set value exception:{}",e);
return false;
}
}
获取元素
public Object get(String key){
return key == null ? null : redisTemplate.opsForValue().get(key);
}
添加元素并设置过期时间
public boolean setex(String key,Object value,long expire){
try{
//TimeUnit.SECONDS指定类型为秒
redisTemplate.opsForValue().set(key,value,expire,TimeUnit.SECONDS);
return true;
}catch (Exception e){
log.error("redis set value and expire exception:{}",e);
return false;
}
}
Hash类型的操作
添加元素
public boolean hset(String key, String field, Object value,long seconds) {
try {
redisTemplate.opsForHash().put(key, field, value);
expire(key,seconds);//调用通用方法设置过期时间
return true;
}catch (Exception e){
log.error("redis hset and expire eror,key:{},field:{},value: {},exception:{}",key,field,value,e);
return false;
}
}
获取数据
public Object hget(String key,String field){
return redisTemplate.opsForHash().get(key,field);
}
set类型的操作
添加元素
public long sset(String key ,Object...values){
try {
return redisTemplate.opsForSet().add(key,values);
}catch (Exception e){
log.error("redis sset error,key:{},value:{},values:{},exception:
{}",key,values,e);
return 0;
}
}
获取set的长度
public long sgetSize(String key){
try {
return redisTemplate.opsForSet().size(key);
}catch (Exception e){
log.error("redis sgetSize error,key:{},exception:{}",key,e);
return 0;
}
}
获取元素
public Set<Object> sgetAll(String key){
try {
return redisTemplate.opsForSet().members(key);
}catch (Exception e){
log.error("redis sgetAll error,key:{},exception:{}",key,e);
return null;
}
}
zset类型的操作
添加元素
public boolean zadd(String key,Object member,double score){
try {
return redisTemplate.opsForZSet().add(key,member,score);
} catch (Exception e) {
log.error("redis zadd error,key:{},value:{},score:{},exception:
{}",key,member,score,e);
return false;
}
}
获取元素
public Set<String> zrange(String key,int start,int end){
try {
Set<Object> range = redisTemplate.opsForZSet().range(key, start, end);
if(range==null||range.size()==0) return null;
return range.stream().
map(o->(String)o).collect(Collectors.toSet());
} catch (Exception e) {
log.error("redis zrange error,key:{},start:{},end:{},exception:{}",key,start,end,e);
return null;
}
}
list类型的操作
添加元素
public boolean lrpush(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
log.error("redis lrpush error,key:{},value:{}exception:
{}",key,value,e);
return false;
}
}
获取元素
public List<Object> getList(String key,int start,int end) {
try {
List<Object> o = redisTemplate.opsForList().range(key,start,end);
return o;
} catch (Exception e) {
return null;
}
}