Redis【Redis数据类型(Bitmaps、Geospatia 、Hyperloglog、安装Redis_Desktop_Manager)】(三)-全面详解(学习总结---从入门到深化)

目录

Redis数据类型_Bitmaps

 简介

 常用命令

setbit

 getbit

 bitcount

 bitop

Redis数据类型_Geospatia 

 简介

 常用命令

geoadd

 geopos

 geodist

 georadius

 Redis数据类型_Hyperloglog

 简介

 什么是基数

 常用命令

pfadd

 pfcount

 pfmerge

使用场景 

 Redis可视化工具_安装Redis_Desktop_Manager

 下载Redis Desktop Manager

 选择安装路径

 连接Redis服务

关闭防火墙

关闭保护模式

开启远程访问

 配置连接服务

 配置信息

 Java整合Redis_Jedis操作

什么是Jedis 

引入Jedis

创建maven工程

引入maven依赖 

Jedis连接到redis

测试相关数据类型 

连接Redis服务

Jedis-API:String

Jedis-API:Keys

Jedis-API:List

Jedis-API:Set

Jedis-API:Hash

Jedis-API:Zset

Jedis-API:Bitmaps

Jedis-API:Geospatia

Jedis-API:Hyperloglog

Java整合Redis_Spring-Data-Redis 

简介 

RedisTemplate介绍

 RedisTemplate中定义了对5种数据结构操作

StringRedisTemplate与RedisTemplate

 pom.xml添加依赖

在application.properties中配置

自定义序列化

使用redisTemplate进行各类型的CURD操作

String数据类型操作

Hash类型的操作

set类型的操作

zset类型的操作

list类型的操作


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;
     }
}

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131360756
今日推荐