目录

  • 三、 五大数据类型
    • Redis-Key
    • String(字符串)
    • List(列表)
    • Set(集合)
    • Hash(哈希)
    • Zset(有序集合)
  • 6. 三种特殊数据类型
    • geospatial 地理位置
    • Hyperloglog
    • Bitmaps

三、 五大数据类型


Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(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
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

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

Redis(三)【五大数据类型三种特殊数据类型】相关推荐

  1. Java数据类型(八种基本数据类型 + 四种引用数据类型)

    1.位(bit): 又名 比特位,表示二进制位,是计算中内部数据储存的最小单位.一个二进制位只能表示0和1两种状态. 2.字节(byte): 是计算机中处理数据的基本单位.一个字节等于八位(1Byte ...

  2. Java 基本数据类型(八种基本数据类型)

    Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. 低 ------------------------------------> 高 byt ...

  3. Redis(测试连接, 五大数据类型,三种特殊数据类型)

    文章目录 测试性能 测试端口: 测试: 基础知识 总共有16个数据库,默认是0号数据库 数据库切换: 清空数据: redis是单线程的 redis为什么是单线程还运行如此快? 五大数据类型 Redis ...

  4. Redis中五大基本数据类型和三种特殊数据类型详解

    目录 介绍 概念 基本命令 redis是单线程的 五大基本数据类型 String 命令 应用场景 List 命令 应用场景 Set 命令 应用场景 Hash 命令 应用场景 Zset 命令 应用场景 ...

  5. 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)

    跟着狂神学Redis 狂神聊Redis 学习方式:不是为了面试和工作学习!仅仅是为了兴趣!兴趣才是最好的老师! 基本的理论先学习,然后将知识融汇贯通! 狂神的Redis课程安排: nosql 讲解 阿 ...

  6. Redis五大基本类型三种特殊数据类型事务操作(悲观锁,乐观锁)

    Redis五大基本类型 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持多种类型的数据 结构,如字符串(strings),散列(hashes) ...

  7. redis的zset的底层实现_Redis(三)--- Redis的五大数据类型的底层实现

    1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...

  8. Redis三种特殊数据类型

    Redis三种特殊数据类型 geospatial 地理位置 朋友的定位, 附近的人, 打车的距离计算 Redis的Geo在Redis3.2版本就推出了.这个功能可以推算地理位置信息, 两地之间的距离, ...

  9. redis 三种特殊数据类型

    三种特性数据类型 geospatial 定位,附近的人,打车距离计算. redis的geo在redis3.2版本就推出了.可推算地理位置的信息,两地之间的距离,方圆几里的人. 6个命令. GEOADD ...

最新文章

  1. avalon数据已更新,视图未更新的bug修复
  2. 关于mysql数据库插入数据,不能插入中文和出现中文乱码问题
  3. python 无序表查找
  4. android修改适配器颜色,android viewpager更改适配器
  5. react获取URL中参数
  6. Linux平台下C++编程
  7. UVA 11992 - Fast Matrix Operations(段树)
  8. java单链表存储结构_Java数据结构——单链表
  9. 软件测试--环境讲解
  10. 全方位打造最强终端(iterm2 + oh my zsh)
  11. 聊聊python文件
  12. for循环 php 增加数组维数_php实现给二维数组中所有一维数组添加值的方法
  13. JavaScript
  14. LimeSurvey 安装
  15. Maxscript开发笔记
  16. 如何将手机里的小视频做成GIF动图?一键轻松生成GIF动画
  17. c语言中输入数组时用不用加地址符,C语言中,用格式符”%s”输入字符数组时,数组名前不能加。...
  18. 【LeetCode LCP 3】机器人大冒险
  19. 重构手法46:Parameterize Method (令函数携带参数)
  20. (批处理学习)句柄备份——个人见解之“>nul 3>nul“——记录学习过程(详细)

热门文章

  1. opencv直线拟合cv::fitLine()
  2. 数据分析36计(24):因果推断结合机器学习估计个体处理效应
  3. ajax回调函数有时成功有时失败,$.ajax数据传输成功却执行失败的回调函数
  4. jquery获取父级元素、子级元素、兄弟元素的方法
  5. uniapp 上传图片
  6. Mac 序列号不可用导致超时代视频加密视频播放失败
  7. Day 6.重大医疗伤害事件网络舆情能量传播过程分析*———以“魏则西事件”为例
  8. 2022年双十一蓝牙耳机选哪款?便宜音质好的蓝牙耳机推荐
  9. 文字烫金效果html,ps如何制作烫金效果 PS制作logo烫黄金效果教程
  10. 结对项目之需求分析与原型设计(导师选择)