Redis(三)【五大数据类型&三种特殊数据类型】

三、 五大数据类型


在这里插入图片描述

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)

Redis-Key


命令地址:http://www.redis.cn/commands.html

  • 过期时间设置
######################################################################################
127.0.0.1:6379> clear
127.0.0.1:6379> set name vinjcent
OK
# 判断当前key是否存在
127.0.0.1:6379> EXISTS name
(integer) 1
# 1代表当前数据库
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
(empty array)
# 设置过期时间(秒/m)
127.0.0.1:6379> EXPIRE name 10
(integer) 1
# 查看key的剩余时间
127.0.0.1:6379> ttl name
######################################################################################

在这里插入图片描述

  • 查看数据类型
######################################################################################
127.0.0.1:6379> keys *
1) "age"
2) "name"
# 查看当前key的一个类型
127.0.0.1:6379> type name
string
127.0.0.1:6379> type age
string
######################################################################################

String(字符串)


###########################################String###########################################
# 获取所有key
127.0.0.1:6379> keys *
1) "name"
# 追加字符串		如果当前"name"key不存在,就创建一个key
127.0.0.1:6379> APPEND name "520"
(integer) 11
127.0.0.1:6379> get name
"vinjcent520"
# 获取字符串长度
127.0.0.1:6379> STRLEN name
(integer) 11
######################################################################################
# 自增自减
127.0.0.1:6379> set num 0
OK
127.0.0.1:6379> get num
"0"
# 自增1
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
# 自减1
127.0.0.1:6379> decr num
(integer) 1
127.0.0.1:6379> decr num
(integer) 0
# 步长加10
127.0.0.1:6379> INCRBY num 10
(integer) 10
# 步长减10
127.0.0.1:6379> DECRBY num 5
(integer) 5

######################################################################################
# 字符串范围 range
127.0.0.1:6379> set name vinjcent
OK
127.0.0.1:6379> get name
"vinjcent"
# 截取字符串 从下标[0~3]
127.0.0.1:6379> GETRANGE name 0 3
"vinj"
# 获取全部字符串
127.0.0.1:6379> GETRANGE name 0 -1
"vinjcent"
127.0.0.1:6379> set information abcdefg
OK
127.0.0.1:6379> get information
"abcdefg"
# 替换字符串,从下标1开始
127.0.0.1:6379> SETRANGE information 1 xx
(integer) 7
127.0.0.1:6379> get information
"axxdefg"

######################################################################################
# setex (set with expire)	# 设置过期时间
# setnx (set if not exist)	# 不存在再设置	(在分布式锁中会常常使用)

# 设置一个test的值为"hello",过期时间为30s
127.0.0.1:6379> setex test 30 "hello"
OK
127.0.0.1:6379> ttl test
(integer) 27
# 如果mykey不存在,创建
127.0.0.1:6379> setnx mykey "redis"
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "test"
127.0.0.1:6379> ttl test
(integer) -2
# 如果存在则创建失败
127.0.0.1:6379> setnx mykey "MongoDB"
(integer) 0
127.0.0.1:6379> keys *
1) "mykey"
127.0.0.1:6379> 

######################################################################################
# 同时设置多个值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
# 如果不存在,同时设置多个值
127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0
# mset也遵循原子性	(要么一起成功,要么一起失败)
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> get k4
(nil)

### 对象
# 设置一个user:1对象,值为json字符串来保存
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"	
# user:{id}:{field} value
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"

###########################################getset###########################################
# 先get后set
# 如果不存在值,则返回nil
127.0.0.1:6379> GETSET db redis
(nil)
127.0.0.1:6379> get db
"redis"
# 如果存在,获取原来的值,并设置新的值
127.0.0.1:6379> getset db MongoDB
"redis"
127.0.0.1:6379> get db
"MongoDB"
# 数据结构是相通的

######################################################################################

String场景使用:value可以是字符串数字

List(列表)


再redis可以当成栈(Stack)、队列(Queue),阻塞队列

所有的命令都是以list开头

###########################################List########################################
# 将一个值或多个值插入到列表的头部
127.0.0.1:6379> LPUSH list one
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
# 获取list的值
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
# 通过区间获取值
127.0.0.1:6379> LRANGE list 0 1
1) "three"
2) "two"
# 将一个值或多个值插入到列表的尾部
127.0.0.1:6379> RPUSH list right
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
# 移除列表的第一个元素
127.0.0.1:6379> LPOP list
"three"
# 移除列表的最后一个元素
127.0.0.1:6379> RPOP list
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
######################################################################################
# 移除下标的某个值
127.0.0.1:6379> LINDEX list 0
"two"
# 不存在
127.0.0.1:6379> LINDEX list 5
(nil)
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
# 返回列表的长度
127.0.0.1:6379> LLEN list
(integer) 2
######################################################################################
# 移除指定的值,移除list集合中指定个数的value,精确匹配
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "one"
3) "two"
4) "one"
# 移除1个key是"two"的值
127.0.0.1:6379> LREM list 1 two
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "one"
3) "one"
# 移除2个key是"one"的值
127.0.0.1:6379> LREM list 2 one
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "one"

######################################################################################
### trim 修剪(左是头,右是尾)

127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "hello1"
(integer) 2
127.0.0.1:6379> RPUSH mylist "hello2"
(integer) 3
127.0.0.1:6379> RPUSH mylist "hello3"
(integer) 4
127.0.0.1:6379> RPUSH mylist "hello4"
(integer) 5
## 通过下标截取指定长度
127.0.0.1:6379> LTRIM mylist 1 2
OK
# list被修建后只剩下截取元素
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"

######################################################################################
# rpoplpush移除列表的最后一个元素,将它一定到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
# rpoplpush移除列表的最后一个元素,将它一定到新的列表中
127.0.0.1:6379> rpoplpush mylist otherlist
"hello3"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> LRANGE otherlist 0 -1
1) "hello3"

######################################################################################
# lset将列表中指定下标的值,替换成另外一个值,更新操作
# 判断列表是否存在
127.0.0.1:6379> EXISTS list
(integer) 0
127.0.0.1:6379> LPUSH list value1
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "value1"
# 如果存在则更新当前下标的值,不存在则报错
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "item"

######################################################################################
# LINSERT插入值,将某一个具体的value插入某个元素的前门或后面
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "world"
(integer) 2
# 在值为"world"前面插入"other"
127.0.0.1:6379> LINSERT mylist before "world" "other"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
# 在值为"world"后面插入"other"
127.0.0.1:6379> LINSERT mylist after "world" "other"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "other"
###################################################################################

小结

  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除所有值,空链表也代表不存在
  • 在两边插入或者改动值,效率最高;中间元素,相对来说效率会低点

既可以作为也可以作为队列

Set(集合)


set中的值无序不能重复

###########################################Set########################################
# Set集合中添加元素
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "hello1"
(integer) 1
127.0.0.1:6379> sadd myset "hello2"
(integer) 1
# 查看指定set的所有值
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "hello2"
3) "hello1"
# 判断某一个值是不是再set集合中
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset word
(integer) 0
######################################################################################
# 获取set集合的个数
127.0.0.1:6379> scard myset
(integer) 3
# 移除set集合中的指定元素
127.0.0.1:6379> scard myset
(integer) 3
# 移除
127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "hello2"
2) "hello1"
######################################################################################
# 随机获取某个set集合元素
127.0.0.1:6379> smembers myset
1) "hello2"
2) "hello1"
# 随机获取
127.0.0.1:6379> SRANDMEMBER myset
"hello2"
127.0.0.1:6379> SRANDMEMBER myset
"hello2"
127.0.0.1:6379> SRANDMEMBER myset
"hello1"
# 随机获取1个set集合元素
127.0.0.1:6379> SRANDMEMBER myset 1
1) "hello2"
# 随机获取2个set集合元素
127.0.0.1:6379> SRANDMEMBER myset 2
1) "hello1"
2) "hello2"
######################################################################################
# 随机删除set集合的元素
127.0.0.1:6379> SMEMBERS myset
1) "hello2"
2) "hello1"
127.0.0.1:6379> spop myset
"hello2"
127.0.0.1:6379> spop myset
"hello1"
######################################################################################
# 将一个指定的值,移动到另外一个
127.0.0.1:6379> sadd myset "hello1"
(integer) 1
127.0.0.1:6379> sadd myset "hello2"
(integer) 1
127.0.0.1:6379> sadd myset "hello3"
(integer) 1
127.0.0.1:6379> sadd myset "hello4"
(integer) 1
127.0.0.1:6379> sadd myset2 "world"
(integer) 1
# smove source destination source_value
127.0.0.1:6379> smove myset myset2 "hello1"
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello2"
2) "hello4"
3) "hello3"
127.0.0.1:6379> SMEMBERS myset2
1) "world"
2) "hello1"
######################################################################################
- 差集	SDIFF
- 交集	SINTER
- 并集	SUNION
127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> sadd set2 e
(integer) 1
# 差集(以第一个为首)
127.0.0.1:6379> SDIFF set1 set2
1) "a"
2) "b"
# 并集
127.0.0.1:6379> SINTER set1 set2
1) "c"
# 并集
127.0.0.1:6379> SUNION set1 set2
1) "b"
2) "c"
3) "a"
4) "e"
5) "d"
###################################################################################

Hash(哈希)


Map集合,<key-value>,这时候这的值就是一个map集合!本质和String类型没有太大区别,还是一个简单的key-value

###########################################Map########################################
# set一个具体的key-value
127.0.0.1:6379> hset myhash name vinjcent
(integer) 1
127.0.0.1:6379> hget myhash name
"vinjcent"
# set多个key-value,当key存在时,可以进行覆盖
127.0.0.1:6379> hmset myhash name totoro username 7758258
OK
# 获取多个字段值
127.0.0.1:6379> hmget myhash name username
1) "totoro"
2) "7758258"
# 获取全部的数据,以key1-value1 key2-value2的形式输出
127.0.0.1:6379> hgetall myhash
1) "name"
2) "totoro"
3) "username"
4) "7758258"
######################################################################################
# 删除hash指定的字段,对应的value值也就没有了
127.0.0.1:6379> hdel myhash name
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "username"
2) "7758258"
######################################################################################
# 获取hash表的字段数量
127.0.0.1:6379> hlen myhash
(integer) 1
# 判断hash中指定字段是否存在
127.0.0.1:6379> HEXISTS myhash field1
(integer) 1
######################################################################################
# 只获得所有的key
127.0.0.1:6379> hkeys myhash
1) "username"
2) "field1"
3) "field2"
4) "field3"
# 只获得所有的value
127.0.0.1:6379> hvals myhash
1) "7758258"
2) "hello"
3) "world"
4) "welcome"
######################################################################################
# 自增自减
127.0.0.1:6379> hset myhash field4 5
(integer) 1
# 指定自增
127.0.0.1:6379> HINCRBY myhash field4 1
(integer) 6
# 自减
127.0.0.1:6379> HINCRBY myhash field4 -1
(integer) 5
# 不存在则创建
127.0.0.1:6379> hsetnx myhash field5 hello
(integer) 1
# 存在则失败
127.0.0.1:6379> hsetnx myhash field5 world
(integer) 0
###################################################################################

hash 变更的用户 user:{name:xxx,age:xx},尤其是经常变动的类型,hash

Zset(有序集合)


在set的基础上,增加了一个值,zset key priority value

###########################################Zset########################################
# 添加一个值
127.0.0.1:6379> zadd myZset 1 one
(integer) 1
# 添加多个值
127.0.0.1:6379> zadd myZset 2 two 3 three
(integer) 2
# 输出所有
127.0.0.1:6379> ZRANGE myZset 0 -1
1) "one"
2) "two"
3) "three"
######################################################################################
# 排序	遵循原则:	ZRANGEBYSCORE key min max
127.0.0.1:6379> zadd salary 2500 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 3000 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 200 vinjcent
(integer) 1
# 从小到大排序
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "vinjcent"
2) "zhangsan"
3) "xiaoming"
# 从小到大排序,并输出优先级
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "vinjcent"
2) "200"
3) "zhangsan"
4) "2500"
5) "xiaoming"
6) "3000"
# 从大到小进行排序
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhangsan"
2) "vinjcent"
# 显示工资小于2500的key升序排列
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
1) "vinjcent"
2) "200"
3) "zhangsan"
4) "2500"
######################################################################################
# 移除元素 ZREM
127.0.0.1:6379> ZRANGE salary 0 -1
1) "vinjcent"
2) "zhangsan"
3) "xiaoming"
127.0.0.1:6379> zrem salary xiaoming
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "vinjcent"
2) "zhangsan"
# 获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
######################################################################################
# 获取指定区间的成员的数量 ZCOUNT
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 hello2 3 hello3
(integer) 2
127.0.0.1:6379> ZCOUNT myset 1 3
(integer) 3
######################################################################################

6. 三种特殊数据类型


geospatial 地理位置

Redis 的 Geo 在 Redis3.2版本就推出了

这个功能能够推算出地理位置信息,两地之间的距离

英文官方:https://redis.io/commands/geoadd/

六个命令

GEOADD

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作

有效的纬度从-85.05112878°到85.05112878°

有效的经度从-180°到180°

###########################################添加地理位置########################################
# 规则: 两级无法添加,一般会下载城市数据,直接通过java程序一次导入
# (error) ERR invalid longitude,latitude pair 39.900000,116.400000
# 参数 key 经度 纬度 名称
127.0.0.1:6379> GEOADD china:city 116.405285 39.90 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou
(integer) 1
127.0.0.1:6379> GEOADD china:city 108.96 34.26 xian
(integer) 1
######################################################################################

GEOPOS

获得当前定位:一定是一个坐标值

###########################################获取指定的城市的经度和纬度########################################
127.0.0.1:6379> GEOPOS china:city beijing
1) 1) "116.40528291463851929"
   2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city chongqing
1) 1) "106.49999767541885376"
   2) "29.52999957900659211"
######################################################################################

GEODIST

单位:

  • m 表示单位为米
  • km 表示单位为千米
  • mi 表示单位为英里
  • ft 表示单位为英尺
###########################################查看城市之间的距离########################################
# 查看上海到北京的直线距离
127.0.0.1:6379> GEODIST china:city beijing shanghai
"1067174.4667"
127.0.0.1:6379> GEODIST china:city beijing shanghai km
"1067.1745"
127.0.0.1:6379> GEODIST china:city beijing shanghai mi
"663.1131"
127.0.0.1:6379> GEODIST china:city beijing shanghai ft
"3501228.5652"
###################################################################################

GEORADIUS

附近的人(获得所有附近的人的地址,定位)通过半径来获取

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素

在这里插入图片描述

###########################################获取附近的人########################################
# 获取以【经度 维度】坐标的,寻找方圆1000 km内的城市(前提是数据都录入key中) 
127.0.0.1:6379> GEORADIUS china:city 100 30 1000 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 100 30 2000 km
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "beijing"
# 显示到坐标的位置
127.0.0.1:6379> GEORADIUS china:city 100 30 1000 km withdist
1) 1) "chongqing"
   2) "629.6756"
2) 1) "xian"
   2) "967.2846"
# 显示坐标的定位信息
127.0.0.1:6379> GEORADIUS china:city 100 30 1000 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
# 筛选出指定的结果
127.0.0.1:6379> GEORADIUS china:city 100 30 1000 km withdist withcoord count 1
1) 1) "chongqing"
   2) "629.6756"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
###################################################################################

GEORADIUSBYMEMBER

这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

# 找出位于指定元素周围的其它元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"

GEOHASH

该命令将返回11个字符的Geohash字符串

# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379> GEOHASH china:city beijing chongqing
1) "wx4fbzedre0"
2) "wm5xzrybty0"

GEO 底层的实现原理其实就是Zset!我们可以使用Zset命令来操作GEO

# 查看全部地图中元素
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
# 移除指定元素
127.0.0.1:6379> zrem china:city xian
(integer) 1

Hyperloglog

什么是基数

A {1,3,5,7,8,9}

B {1,3,5,7,8}

基数(不重复的元素)= 5(可以接受的误差)

简介

Redis Hyperloglog 基数统计的算法!

如果 HyperLogLog 估计的近似基数在执行命令后发生变化,PFADD则返回 1,否则返回 0。如果指定的键不存在,该命令会自动创建一个空的 HyperLogLog 结构(即指定长度和给定编码的 Redis 字符串)

优点:占用的内存是固定,2^26 不同的元素的技术,只需要费用 12KB 内存!如果要从内存角度来比较的话 Hyperloglog 首选!

网页的 UV(一个人访问一个网站多次,但是还是算作一个人!)

传统的方式,set 保存用户的id,然后就可以统计 set 中的元素作为标准判断

这种方式如果保留了大量的用户id,就会比较麻烦!

# 创建第一组元素 mykey
127.0.0.1:6379> PFADD mykey a b c d e f g h i j k
(integer) 1
# 统计 mykey 元素的基数数量
127.0.0.1:6379> PFCOUNT mykey
(integer) 11
# 创建第二组元素 mykey2
127.0.0.1:6379> PFADD mykey2 q w e r t y u i o
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
# 合并两组 mykey mykey2 => mykey3
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK
# 查看合并数量情况
127.0.0.1:6379> PFCOUNT mykey3
(integer) 17

如果允许容错,那么一定可以使用 Hyperloglog

如果不允许容错,就用是 set 或者自己的数据类型即可

Bitmaps

位存储

Bitmaps位图,数据结构!都是操作二进制位来进行记录,只有0和1两个状态

# 使用 bitmap 来记录周一到周日的打卡
# 周一:1 周二:0 周三:0 周四:1 周五:1 周六:0
127.0.0.1:6379> SETBIT sign 1 1
(integer) 0
127.0.0.1:6379> SETBIT sign 2 0
(integer) 0
127.0.0.1:6379> SETBIT sign 3 0
(integer) 0
127.0.0.1:6379> SETBIT sign 4 1
(integer) 0
127.0.0.1:6379> SETBIT sign 5 1
(integer) 0
127.0.0.1:6379> SETBIT sign 6 0
(integer) 0
# 查看某一天是否打卡
127.0.0.1:6379> GETBIT sign 1
(integer) 1
127.0.0.1:6379> GETBIT sign 2
(integer) 0
# 统计打卡的天数
127.0.0.1:6379> BITCOUNT sign
(integer) 3
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值