Rdies数据结构及其数据类型
数据结构:
整个Redis中所有数据以KV结构存在
- K: 作为唯一标识符,固定为String类型,根据Key读取Value
- V:真正存储数据,可以用多种类型
- String、Hash、List、Set、Zset、Bitmap、HypeLogLog
数据类型:
Key:String | Value类型 | 应用场景 |
String | String | 一般用于存储单个数据 指标的结果 |
String | Hash | 用于存储整个对象所有 属性值 |
String | List | 有序允许重复的集合, 每天获取最后一个值 |
String | Set | 无序且不重复的集合, 直接通过长度得到UV |
String | Zset | 有序不可重复的集合,统计TopN |
String | BitMap | 将一个字符串构建位, 通过0和1来标记每一位 |
String | HypeLogLog | 类似于Set集合,底层实 现原理不一样,数据量大的情况下,性能会更好,结果可能存在一定的误差 |
通用命令
- keys:列举当前数据库中所有Key 语法:keys 通配符
- del key:删除某个KV
- exists key :判断某个Key是否存在
- type key:判断这个K对应的V的类型的
- expire K 过期时间:设置某个K的过期时间,一旦到达过期时间,这个K会被自动删除
- ttl K:查看某个K剩余的存活时间
- select N:切换数据库的 Redis默认由16个数据:db0 ~ db15,个数可以通过配置文件修改,名称不能改 Redis是一层数据存储结构:所有KV直接存储在数据库中 默认进入db0
- move key N:将某个Key移动到某个数据库中
- flushdb:清空当前数据库的所有Key
- flushall:清空所有数据库的所有Key
String类型命令
命令 | 语法 | 作用 |
set | set K V | 给String类型的Value的进行赋值或者更新 |
get | get K | 根据key读取String类型的Value的值 |
mset | mset K1 V1 K2 V2 …… | 用于批量写多个String类型的KV |
mget | mget K1 K2 K3 …… | 用于批量读取String类型的Value |
setnx | setnx K V | 只能用于新增数据,当K不存在时可以进行新增 |
incr | incr K | 用于对数值类型的字符串进行递增,递增1,一般用于做计数器 |
incrby | incrby K N | 指定对数值类型的字符串增长固定的步长 |
decr | decr K | 对数值类型的数据进行递减,递减1 |
decrby | decrby K N | 按照指定步长进行递减 |
incrbyfloat | incrbyfloat K N | 基于浮点数递增 |
strlen | strlen K | 统计字符串的长度 |
getrange | getrange s2 start end | 用于截取字符串 |
Hash类型命令
命令 | 语法 | 作用 |
hset | hset K k v | 用于为某个K添加一个属性 |
hget | hget K k | 用于获取某个K的某个属性的值 |
hmset | hmset K k1 v1 k2 v2 …… | 批量的为某个K赋予新的属性 |
hmget | hmget K k1 k2 k3…… | 批量的获取某个K的多个属性的值 |
hgetall | hgetall K | 获取所有属性的值 |
hdel | hdel K k1 k2 …… | 删除某个属性 |
hlen | hlen K | 统计K对应的Value总的属性的个数 |
hexists | hexists K k | 判断这个K的V中是否包含这个属性 |
hvals | hvals K | 获取所有属性的value的 |
list类型常用命令
命令 | 语法 | 作用 |
lpush | lpush K e1 e2 e3…… | 将每个元素放到集合的左边,左序放入 |
rpush | rpush K e1 e2 e3…… | 将每个元素放到集合的右边,右序放入 |
lrange | lrange K start end lrange K 0 -1:所有元素 | 通过下标的范围来获取元素的数据 |
llen | llen K | 统计集合的长度 |
lpop | lpop K | 删除左边的一个元素 |
rpop | rpop K | 删除右边的一个元素 |
Set类型的常用命令(无序不重复)
命令 | 语法 | 作用 |
sadd | sadd K e1 e2 e3 e4 e5…… | 用于添加元素到Set集合中 |
smembers | smembers K | 用于查看Set集合的所有成员 |
sismember | sismember K e1 | 判断是否包含这个成员 |
srem | srem K e | 删除其中某个元素 |
scard | scard K | 统计集合长度 |
sunion | sunion K1 K2 | 取两个集合的并集 |
sinter | sinter K1 K2 | 取两个集合的交集 |
Zset类型的常用命令
命令 | 语法 | 作用 |
zadd | zadd K score1 k1 score2 k2 …… | 用于添加元素到Zset集合中 |
zrange | zrange K start end [withscores] | 范围查询 |
zrevrange | zrevrange K start end [withscores] | 倒序查询 |
zrem | zrem K k1 | 移除一个元素 |
zcard | zcard K | 统计集合长度 |
zscore | zscore K k | 获取评分 |
Redis中不建议存储小数值,存在精度问题,建议转换为整形存储
HyperLogLog类型的常用命令
命令 | 语法 | 作用 |
pfadd | pfadd K e1 e2 e3…… | 用于添加元素 |
pfcount | pfcount K | 用于统计个数 |
pfmerge | pfmerge pfrs pf1 pf2…… | 用于实现集合合并 |
功能:类似于Set集合,用于实现数据的去重
-
区别:底层实现原理不一样
-
应用:适合于数据量比较庞大的情况下的使用,存在一定的误差率
BitMap类型的常用命令
命令 | 语法 | 作用 |
setbit | setbit bit1 位置 0/1 | 修改某一位的值 |
getbit | getbit K 位置 | 查看某一位的值 |
bitcount | bitcount K [start end] start和 end表示的是字节:1 字节 = 8 位 | 用于统计位图中所有1的个数 |
bitop | bitop and/or/xor/not bitrs bit1 bit2 | 用于位图的运算:and/or/not |
-
功能:通过一个String对象的存储空间,来构建位图,用每一位0和1来表示状态
-
Redis中一个String最大支持512M = 2^32次方,1字节 = 8位
-
使用时,可以指定每一位对应的值,要么为0,要么为1,默认全部为0
-
用下标来标记每一位,第一个位的下标为0
-
-
举例:统计UV
-
一个位图中包含很多位,可以用每一个位表示一个用户id
-
读取数据,发现一个用户id,就将这个用户id对应的那一位改为1
-
统计整个位图中所有1的个数,就得到了UV
-
使用测试代码(使用jedis)
package jedis;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Demo02 {
//单节点连接对象:Jedis
Jedis jedis = null;
//创建分片集群连接对象
JedisCluster jedisCluster = null;
//创建连接池
@Before
public void getConnection() {
//构建连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);//最大连接数
//创建连接池对象
JedisPool jedisPool = new JedisPool(config, "node1", 6379);
//从子池中获取连接对象
jedis = jedisPool.getResource();
}
//创建测试
@Test
public void test() {
//使用上面的命令即可
jedis.hset("m1", "name", "zhangsan");
System.out.println(jedis.hget("m1", "name"));
}
@After
public void closeCollection() {
jedis.close();
}
}
依赖
<properties>
<jedis.version>3.2.0</jedis.version>
</properties>
<dependencies>
<!-- Jedis 依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- JUnit 4 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>