redis基础
首先说明一点 redis命令不区分大小写,下面直接演示
# windows启动redis命令,在redis安装目录打开cmd 输入以下命令即可开启redis
redis-server.exe redis.windows.conf
# 删除所有redis缓存
127.0.0.1:6379> flushdb
OK
#切换到第四个数据库
127.0.0.1:6379> select 3
OK
# 存入key为飞鱼值为redis的数据
127.0.0.1:6379[3]> set feiyu redis
OK
# 取出key为飞鱼的数据
127.0.0.1:6379[3]> get feiyu
"redis"
#删除key为feiyu的数据
127.0.0.1:6379[3]> del feiyu
(integer) 1
127.0.0.1:6379[3]> get feiyu
(nil)
# 检查给定的key是否存在(1存在 0不存在)
127.0.0.1:6379[3]> exists feiyu
(integer) 0
#############################################
127.0.0.1:6379[3]> set feiyu v
OK
# 设置key的过期时间(单位 : 秒)
127.0.0.1:6379[3]> expire feiyu 500
(integer) 1
# 查询key的过期时间(单位秒)
127.0.0.1:6379[3]> ttl feiyu
(integer) 495
127.0.0.1:6379[3]> ttl feiyu
(integer) 492
# 查询key的过期时间(单位:毫秒)
127.0.0.1:6379[3]> pttl feiyu
(integer) 469976
# 查询key的类型
127.0.0.1:6379[3]> type feiyu
string
# 移除 key 的过期时间,key 将持久保持。
127.0.0.1:6379[3]> persist feiyu
(integer) 1
127.0.0.1:6379[3]> ttl feiyu
(integer) -1
# 修改 key 的名称
127.0.0.1:6379[3]> rename feiyu yu
OK
127.0.0.1:6379[3]> get yu
"v"
Redis 键相关的其他命令:
1
DUMP key
序列化给定 key ,并返回被序列化的值。
2EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受 的时间参数是 UNIX 时间戳(unix timestamp)。
3PEXPIRE key milliseconds
设置 key 的过期时间亿以毫秒计。
4PEXPIREAT key milliseconds-timestamp
设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
5KEYS pattern
查找所有符合给定模式( pattern)的 key 。
6MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中。
7PTTL key
以毫秒为单位返回 key 的剩余的过期时间。
8RANDOMKEY
从当前数据库中随机返回一个 key 。
9RENAMENX key newkey
仅当 newkey 不存在时,将 key 改名为 newkey 。
基本数据类型
1、String
Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:
# 设置指定 key 的值
127.0.0.1:6379[3]> set feiyu feiyuRedis
OK
# 获取指定key的值
127.0.0.1:6379[3]> get feiyu'
Invalid argument(s)
127.0.0.1:6379[3]> get feiyu
"feiyuRedis"
# 返回key字符串的子字符串(0到-1:表示获取全部)
127.0.0.1:6379[3]> getrange feiyu 0 -1
"feiyuRedis"
127.0.0.1:6379[3]> getrange feiyu 0 3
"feiy"
# 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
127.0.0.1:6379[3]> getset feiyu xiaoming
"feiyuRedis"
127.0.0.1:6379[3]> get feiyu
"xiaoming"
127.0.0.1:6379[3]> set xiaoming v1
OK
127.0.0.1:6379[3]> set xiaoli v2
OK
# 获取所有的key
127.0.0.1:6379[3]> keys *
1) "feiyu"
2) "xiaoming"
3) "xiaoli"
# 获取多个指定key的值
127.0.0.1:6379[3]> mget feiyu xiaoming xiaoli
1) "xiaoming"
2) "v1"
3) "v2"
# 只有在 key 不存在时设置 key 的值。
127.0.0.1:6379[3]> setnx feiyu vfeiyu
(integer) 0
127.0.0.1:6379[3]> setnx k1 v1
(integer) 1
# 返回字符串的长度
127.0.0.1:6379[3]> strlen feiyu
(integer) 8
# 同时设置多个key-value的值
127.0.0.1:6379[3]> mset k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379[3]> keys *
1) "k2"
2) "k4"
3) "feiyu"
4) "xiaoming"
5) "k3"
6) "xiaoli"
7) "k1"
127.0.0.1:6379[3]> set k6 1
OK
# 将key中存储的值增一
127.0.0.1:6379[3]> incr k6
(integer) 2
127.0.0.1:6379[3]> get k6
"2"
# 将 key 所储存的值加上给定的增量值
127.0.0.1:6379[3]> incrby k6 9
(integer) 11
# 将 key 中储存的数字值减一。
127.0.0.1:6379[3]> decr k6
(integer) 10
# key 所储存的值减去给定的减量值 。
127.0.0.1:6379[3]> decrby k6 5
(integer) 5
# 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
127.0.0.1:6379[3]> append feiyu end
(integer) 11
127.0.0.1:6379[3]> get feiyu
"xiaomingend"
常用的 redis 字符串命令及描述:
1
SET key value
设置指定 key 的值
2GET key
获取指定 key 的值。
3GETRANGE key start end
返回 key 中字符串值的子字符
4GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
7SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9SETNX key value
只有在 key 不存在时设置 key 的值。
10SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11STRLEN key
返回 key 所储存的字符串值的长度。
12MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15INCR key
将 key 中储存的数字值增一。
16INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18DECR key
将 key 中储存的数字值减一。
19DECRBY key decrement key
所储存的值减去给定的减量值(decrement) 。
20APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
2、list
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
# 使用LPUSH 将值插入了名为 k 的列表当中。
127.0.0.1:6379[3]> lpush k mysql
(integer) 1
127.0.0.1:6379[3]> lpush k oracle
(integer) 2
127.0.0.1:6379[3]> lpush k redis
(integer) 3
127.0.0.1:6379[3]> lpush k es
(integer) 4
# 查询下标0 到5 之间的值
127.0.0.1:6379[3]> lrange k 0 5
1) "es"
2) "redis"
3) "oracle"
4) "mysql"
# 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
127.0.0.1:6379[3]> blpop k 3
1) "k"
2) "es"
# 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
127.0.0.1:6379[3]> brpop k 1
1) "k"
2) "mysql"
# 通过索引获取列表中的元素
127.0.0.1:6379[3]> lindex k 2
(nil)
127.0.0.1:6379[3]> lindex k 1
"oracle"
127.0.0.1:6379[3]> lrange k 0 5
1) "redis"
2) "oracle"
# 获取列表长度
127.0.0.1:6379[3]> llen k
(integer) 2
# 将一个或多个值插入到列表头部
127.0.0.1:6379[3]> lpush k1 sqlserver mongdb mysql2 mysql3
(integer) 4
127.0.0.1:6379[3]> lrange k1 0 10
1) "mysql3"
2) "mysql2"
3) "mongdb"
4) "sqlserver"
# 将一个或多个值插入到已存在的列表头部
127.0.0.1:6379[3]> lpushx k1 redis
(integer) 5
127.0.0.1:6379[3]> lrange k1 0 10
1) "redis"
2) "mysql3"
3) "mysql2"
4) "mongdb"
5) "sqlserver"
# 移除列表元素
127.0.0.1:6379[3]> lrem k1 1 mysql2
(integer) 1
127.0.0.1:6379[3]> lrange k1 0 10
1) "redis"
2) "mysql3"
3) "mongdb"
4) "sqlserver"
# 通过索引设置列表元素的值 该索引一定要存在 索引从0开始
127.0.0.1:6379[3]> lset k1 4 redis1
(error) ERR index out of range
127.0.0.1:6379[3]> lset k1 0 redis1
OK
127.0.0.1:6379[3]> lrange k1 0 5
1) "redis1"
2) "mysql3"
3) "mongdb"
4) "sqlserver"
# 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
127.0.0.1:6379[3]> ltrim k1 2 3
OK
127.0.0.1:6379[3]> lrange k1 0 5
1) "mongdb"
2) "sqlserver"
# 移除并获取列表最后一个元素
127.0.0.1:6379[3]> rpop k1
"sqlserver"
# 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
127.0.0.1:6379[3]> rpoplpush k1 k2
"mongdb"
127.0.0.1:6379[3]> lrange k2 0 10
1) "mongdb"
127.0.0.1:6379[3]> lrange k1 0 10
(empty list or set)
列表相关的基本命令及描述:
1
BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index
通过索引获取列表中的元素
5LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者后插入元素
6LLEN key
获取列表长度
7LPOP key
移出并获取列表的第一个元素
8LPUSH key value1 [value2]
将一个或多个值插入到列表头部
9LPUSHX key value
将一个或多个值插入到已存在的列表头部
10LRANGE key start stop
获取列表指定范围内的元素
11LREM key count value
移除列表元素
12LSET key index value
通过索引设置列表元素的值
13LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key
移除并获取列表最后一个元素
15RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16RPUSH key value1 [value2]
在列表中添加一个或多个值
17RPUSHX key value
为已存在的列表添加值
3、hash
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
可以理解为key-map形式 即key-形式
# 同时将多个 field-value (域-值)对设置到哈希表 key 中。
127.0.0.1:6379[3]> hmset feiyu name "feiyu" age 18 sex "man" like "redis"
OK
# 获取key中某一个field的值
127.0.0.1:6379[3]> hget feiyu name
"feiyu"
# 获取key中所有的属性和值
127.0.0.1:6379[3]> hgetall feiyu
1) "name"
2) "feiyu"
3) "age"
4) "18"
5) "sex"
6) "man"
7) "like"
8) "redis"
# 删除key中某一个字段以及字段的值
127.0.0.1:6379[3]> hdel feiyu like
(integer) 1
# 查询key中的field是否存在(0 不存在 1 存在)
127.0.0.1:6379[3]> hexists feiyu like
(integer) 0
127.0.0.1:6379[3]> hexists feiyu sex
(integer) 1
# 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
127.0.0.1:6379[3]> hincrby feiyu age 2
(integer) 20
# 获取所有哈希表中的字段
127.0.0.1:6379[3]> hkeys feiyu
1) "name"
2) "age"
3) "sex"
# 获取哈希表中字段的数量
127.0.0.1:6379[3]> hlen feiyu
(integer) 3
# 获取所有给定字段的值
127.0.0.1:6379[3]> hmget feiyu name age
1) "feiyu"
2) "20"
# 将哈希表 key 中的字段 field 的值设为 value 。 向指定key中添加field
127.0.0.1:6379[3]> hset feiyu db redis
(integer) 1
127.0.0.1:6379[3]> hgetall feiyu
1) "name"
2) "yufei"
3) "age"
4) "20"
5) "sex"
6) "man"
7) "db"
8) "redis"
# 只有在字段 field 不存在时,设置哈希表字段的值。
127.0.0.1:6379[3]> hsetnx feiyu name feiyu
(integer) 0
127.0.0.1:6379[3]> hsetnx feiyu color red
(integer) 1
127.0.0.1:6379[3]> hgetall feiyu
1) "name"
2) "yufei"
3) "age"
4) "20"
5) "sex"
6) "man"
7) "size"
8) "big"
9) "color"
10) "red"
redis hash 基本命令及描述:
1
HDEL key field2 [field2]
删除一个或多个哈希表字段
2HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3HGET key field
获取存储在哈希表中指定字段的值/td>
4HGETALL key
获取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7HKEYS key
获取所有哈希表中的字段
8HLEN key
获取哈希表中字段的数量
9HMGET key field1 [field2]
获取所有给定字段的值
10HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
12HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
13HVALS key
获取哈希表中所有值
14HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
4、set
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
# 通过 SADD 命令向名为 feiyu 的集合插入元素
127.0.0.1:6379[3]> sadd feiyu redis
(integer) 1
127.0.0.1:6379[3]> sadd feiyu mongodb
(integer) 1
127.0.0.1:6379[3]> sadd feiyu mysql
(integer) 1
127.0.0.1:6379[3]> sadd feiyu oracle
(integer) 1
# 插入已经存在的元素--失败
127.0.0.1:6379[3]> sadd feiyu oracle
(integer) 0
127.0.0.1:6379[3]> sadd feiyu sqlserver
(integer) 1
# 查看集合feiyu中的所有元素
127.0.0.1:6379[3]> smembers feiyu
1) "mysql"
2) "mongodb"
3) "redis"
4) "oracle"
5) "sqlserver"
# 获取集合的成员数
127.0.0.1:6379[3]> scard feiyu
(integer) 5
127.0.0.1:6379[3]> sadd fei redis oracle mysql nosql db sql
(integer) 6
127.0.0.1:6379[3]> scard fei
(integer) 6
# 返回给定所有集合的差集 以第一个key为主
127.0.0.1:6379[3]> sdiff feiyu fei
1) "mongodb"
2) "sqlserver"
127.0.0.1:6379[3]> sdiff fei feiyu
1) "nosql"
2) "sql"
3) "db"
# 返回给定所有集合的交集
127.0.0.1:6379[3]> sinter feiyu fei
1) "redis"
2) "oracle"
3) "mysql"
# 判断 member 元素是否是集合 key 的成员
127.0.0.1:6379[3]> sismember feiyu sql
(integer) 0
127.0.0.1:6379[3]> sismember feiyu redis
(integer) 1
# 移除并返回集合中的一个随机元素
127.0.0.1:6379[3]> spop feiyu
"redis"
127.0.0.1:6379[3]> spop feiyu
"sqlserver"
# 返回集合中一个或多个随机数(可以指定返回的个数 默认为一个)
127.0.0.1:6379[3]> SRANDMEMBER feiyu 2
1) "oracle"
2) "mysql"
127.0.0.1:6379[3]> SRANDMEMBER feiyu
"mysql"
# 移除集合中一个或多个成员
127.0.0.1:6379[3]> srem feiyu mysql
(integer) 1
# 返回所有给定集合的并集
127.0.0.1:6379[3]> sunion feiyu fei
1) "mongodb"
2) "db"
3) "redis"
4) "nosql"
5) "oracle"
6) "sql"
7) "mysql"
Redis 集合基本命令及描述::
1
SADD key member1 [member2]
向集合添加一个或多个成员
2SCARD key
获取集合的成员数
3SDIFF key1 [key2]
返回给定所有集合的差集
4SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5SINTER key1 [key2]
返回给定所有集合的交集
6SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member
判断 member 元素是否是集合 key 的成员
8SMEMBERS key
返回集合中的所有成员
9SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10SPOP key
移除并返回集合中的一个随机元素
11SRANDMEMBER key [count]
返回集合中一个或多个随机数
12SREM key member1 [member2]
移除集合中一个或多个成员
13SUNION key1 [key2]
返回所有给定集合的并集
14SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
15SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
5、zset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
# 向有序集合添加一个或多个成员,或者更新已存在成员的分数
127.0.0.1:6379[3]> zadd feiyu 1 mysql 2 redis 3 oracle 4 mongodb 5 sqlserver
(integer) 5
# 获取有序集合的成员
127.0.0.1:6379[3]> zrange feiyu 0 -1
1) "mysql"
2) "redis"
3) "oracle"
4) "mongodb"
5) "sqlserver"
# 获取有序集合的成员数
127.0.0.1:6379[3]> zcard feiyu
(integer) 5
# 计算在有序集合中指定区间分数的成员数
127.0.0.1:6379[3]> zcount feiyu -1 6
(integer) 5
127.0.0.1:6379[3]> zcount feiyu 2 4
(integer) 3
127.0.0.1:6379[3]> zcount feiyu 2 7
(integer) 4
127.0.0.1:6379[3]> zcount feiyu 5 7
(integer) 1
# 有序集合中对指定成员的分数加上增量 increment
127.0.0.1:6379[3]> zincrby feiyu 1 sqlserver
"6"
# 通过索引区间返回有序集合成指定区间内的成员
127.0.0.1:6379[3]> zrange feiyu 0 1
1) "mysql"
2) "redis"
# 通过分数返回有序集合指定区间内的成员
127.0.0.1:6379[3]> zrangebyscore feiyu 2 3
1) "redis"
2) "oracle"
# 返回有序集合中指定成员的索引
127.0.0.1:6379[3]> zrank feiyu redis
(integer) 1
# 移除有序集合中的一个或多个成员
127.0.0.1:6379[3]> zrem feiyu sqlserver
(integer) 1
# 返回有序集中指定区间内的成员,通过索引,分数从高到底
127.0.0.1:6379[3]> zrevrange feiyu 0 3
1) "mongodb"
2) "oracle"
3) "redis"
4) "mysql"
# 返回有序集中,成员的分数值
127.0.0.1:6379[3]> zscore feiyu redis
"2"
redis 有序集合的基本命令及描述:
1
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key
获取有序集合的成员数
3ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
5ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
7ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员
8ZRANGEBYLEX key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
9ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
10ZRANK key member
返回有序集合中指定成员的索引
11ZREM key member [member ...]
移除有序集合中的一个或多个成员
12ZREMRANGEBYLEX key min max
移除有序集合中给定的字典区间的所有成员
13ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
14ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
15ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到底
16ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
17ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18ZSCORE key member
返回有序集中,成员的分数值
19ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成员和元素分值)
其他数据类型
HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
场景:
如网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
通过使用一种特殊的算法,而达到使用一个固定空间达到统计基数的作用。
这种算法有误差,是一种概率学问题。0.81% 错误率! 但对于统计UV这类的任务,是可以忽略不计的!
测试使用
如果允许有误差,那么一定可以使用 Hyperloglog !
如果不允许误差,就使用 set 或者自己的数据类型即可!
127.0.0.1:6379> PFADD key "redis"
1) (integer) 1
127.0.0.1:6379> PFADD key "mongodb"
1) (integer) 1
127.0.0.1:6379> PFADD key "mysql"
1) (integer) 1
127.0.0.1:6379> PFCOUNT key
(integer) 3
redis HyperLogLog 的基本命令:
1
PFADD key element [element ...]
添加指定元素到 HyperLogLog 中。
2PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。
3PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
bitmap 位图
场景;
公司记录某个人一个月的打卡情况
一年365天怎么记录一个人在某个网站的登录,活跃情况
两个状态的都能用这种方法进行性能压榨
# 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0
127.0.0.1:6379> EXISTS bit
(integer) 0
127.0.0.1:6379> GETBIT bit 113
(integer) 0
# 对已存在的 offset 进行 GETBIT
127.0.0.1:6379> SETBIT bit 113 1
(integer) 0
127.0.0.1:6379> GETBIT bit 113
(integer) 1
#######################################################
BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
含义:得到总数
举例:
127.0.0.1:6379> SETBIT mykeys 10 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 11 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 21 1
(integer) 0
127.0.0.1:6379> SETBIT mykeys 10 2
(integer) 0
127.0.0.1:6379> BITCOUNT mykeys
(integer) 4
#######################################################
# 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
# 测试登录次数
127.0.0.1:6379> setbit login 0 1
(integer) 0
127.0.0.1:6379> setbit login 3 1
(integer) 0
127.0.0.1:6379> bitcount login 0 -1
(integer) 2
# 周一:1 周二:0 周三:0 周四:1 ......
# 查看某一天是否有打卡!
# 统计操作,统计 打卡的天数!
Geospatial 地理位置
场景;
朋友的定位,附近的人,打车距离计算?
在Redis3.2 版本推出了Geospatial ! 这个功能可以推算地理位置的信息,两地之间的距离。
可以查询一些测试数据
给定几个城市的经纬度:
太原:112.549248,37.857014
北京:116.405285,39.904989
成都:104.065735,30.659462
武汉:114.298572,30.584355
西安: 108.948024,34.263161
洛阳:112.434468,34.663041
getadd
# getadd 添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijing
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
# 参数 key 值()
#插入城市的经纬度
127.0.0.1:6379> geoadd china:city 112.549284 37.857014 taiyuan
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
127.0.0.1:6379> geoadd china:city 104.065735 30.659462 chengdu
127.0.0.1:6379> geoadd china:city 114.298572 30.584355 wuhan
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
127.0.0.1:6379> geoadd china:city 112.434468 34.663041 luoyang
# 获取指定的城市的经度和纬度!
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
127.0.0.1:6379> geopos china:city beijing luoyang
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
2) 1) "112.43446558713912964"
2) "34.6630405862934694"
#两人之间的距离!
#单位:
#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#georadius 以给定的经纬度为中心, 找出某一半径内的元素
#我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
#获得指定数量的人,200
#所有数据应该都录入:china:city ,才会让结果更加请求!
#查询太原到北京的距离
127.0.0.1:6379> geodist china:city beijing taiyuan
"404109.2735"
127.0.0.1:6379> geodist china:city beijing taiyuan km
"404.1093"
#找某个地点(微信定位)方圆1000km内的城市,附近的朋友
127.0.0.1:6379> georadius china:city 110 32 500 km
1) "xian"
2) "luoyang"
3) "wuhan"
# 找出位于指定元素周围的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "taiyuan"
2) "beijing"
3) "xian"
4) "luoyang"
# 查看地图中全部的元素
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chengdu"
2) "xian"
3) "luoyang"
4) "wuhan"
5) "taiyuan"
6) "beijing"
# 移除指定元素!
127.0.0.1:6379> zrem china:city beijing
(integer) 1
整理不易 请您一件三连 蟹蟹!!!
注:想要看视频学习的 请前往:https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0&vd_source=b190127f69e6ab412a8d105e86347543