Redis学习之旅--数据类型

  • Redis-Key
  • String(字符串)
  • list(列表)
  • Set(集合)
  • Hash(哈希)
  • Zset(有序集合)
  • geospatial
  • hyperloglog
  • bitmap

Redis-Key

以下是常见的Redis-Key的命令

127.0.0.1:6379> keys * #查看所有的key
(empty list or set)
127.0.0.1:6379> set name zjc #设置key
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> exists name #查看key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> move name 1  #移除key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> expire name 10 #设置key的到期时间
(integer) 0
127.0.0.1:6379> ttl name #查看key的到期时间
(integer) -2
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name    #查看key的类型
none
127.0.0.1:6379> type age
string

更多命令可以查看Redis的文档:http://www.redis.cn/commands.html

String(字符串)

127.0.0.1:6379> set key1 v1  #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
127.0.0.1:6379> keys *   #获得所有的key
1) "key1"
127.0.0.1:6379> exists key1  #判断一个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" #追加字符串,若不存在则新set 可以去存储
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获取字符串的长度
(integer) 7
127.0.0.1:6379> append key2 "zjc"
(integer) 3
127.0.0.1:6379> keys *
1) "key1"
2) "key2"=========================================
#自增、自减
127.0.0.1:6379> set views 0 #设置初始值为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views    #自增1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views   #自减1
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10      #一次增加指定的步长
(integer) 10
127.0.0.1:6379> get views
"10"
127.0.0.1:6379> decrby views 5   #一次减少指定的步长
(integer) 5
127.0.0.1:6379> get views
"5"=============================================#字符串范围 range127.0.0.1:6379> set key1 "hello,zjcjw" #设置key1的值
OK
127.0.0.1:6379> get key1  #得到key1的值
"hello,zjcjw"
127.0.0.1:6379> getrange key1 0 3 #截取字符串 [0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #获取全部的字符串和get key1一样
"hello,zjcjw"#替换
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xxx #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxxefg"=============================================
#setex(set with expire) 设置过期时间
#setnx(set if not exist) 不存在设置(在分布式锁中会常常用到)127.0.0.1:6379> setex key3 30 "hello" #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx key4 "redis" #如果key4不存在,创建key4(1表示成功)
(integer) 1
127.0.0.1:6379> keys *
1) "key4"
2) "key1"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx key4 "zjc"   #如果key4存在,创建失败(0表示失败)
(integer) 0======================================================
mset 设置多个set值
mget 获取多个set值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
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  #msetnx是一个原子性的操作,要么一起成功,要么一起失败!
(integer) 0
127.0.0.1:6379> get k4
(nil)
======================================
对象127.0.0.1:6379> set user:1{name:zjc,age:3} #设置一个user:1对象  值为json字符老保存做一对象
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set user:1 {name:zjc,age:3}
OK
127.0.0.1:6379> get user:1
"{name:zjc,age:3}"
127.0.0.1:6379> mset user:2:name jw user:2:age 16
OK
127.0.0.1:6379> mget user:2:name user:2:age
1) "jw"
2) "16"
127.0.0.1:6379> ======================================
getset #先get在set
127.0.0.1:6379> getset db redis  #如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongdb #如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongdb"

String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

  • ·计数器
  • ·统计多单位的数量
  • ·粉丝数 ·
  • 对象缓存存储

list(列表)

在Redis里面,我们可以将list玩成栈、队列、阻塞队列!
所有的list命令都是以l开头的

#push
127.0.0.1:6379> lpush list 1 #将一个值或者多个值插入到链表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrange list 0 1 #获取指定区间的值
1) "3"
2) "2"
127.0.0.1:6379> lrange list 0 -1  #获取list中的所有值
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush list 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1 #将一个值或者多个值插入到链表的尾部(右)
1) "3"
2) "2"
3) "1"
4) "4"========================================================
#pop
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> lpop list  #移除list的第一个元素
"3"
127.0.0.1:6379> rpop list  #移除list的最后一个元素
"4"
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"============================================
#index len
127.0.0.1:6379> lrange list 0 -1   #通过下标获取列表的值
1) "2"
2) "1"
127.0.0.1:6379> lindex list 1
"1"
127.0.0.1:6379> lindex list 0
"2"
127.0.0.1:6379> llen list   #获取列表的长度
(integer) 2===========================================
#lrem
127.0.0.1:6379> lrem list 1 1  #移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lrem list 2 4
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"===========================================================#trim 修剪127.0.0.1:6379> lpush list "hello1"
(integer) 1
127.0.0.1:6379> lpush list "hello2"
(integer) 2
127.0.0.1:6379> lpush list "hello3"
(integer) 3
127.0.0.1:6379> lpush list "hello4"
(integer) 4
127.0.0.1:6379> ltrim list 1 2  #通过下标截取指定的长度 这个list已经被改变了,截断了只剩下未被截取的部分了
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello3"
2) "hello2"===================================================
#rpoplpush  #移除列表的最后一个元素,将他们移动到新的列表中!127.0.0.1:6379> rpush list1 "hello1"
(integer) 1
127.0.0.1:6379> rpush list1 "hello2"
(integer) 2
127.0.0.1:6379> rpush list1 "hello3"
(integer) 3
127.0.0.1:6379> rpoplpush list1 list2   #移除列表的最后一个元素,将他们移动到新的列表中!
"hello3"
127.0.0.1:6379> lrange list1 0 -1   #查看原来的列表
1) "hello1"
2) "hello2"
127.0.0.1:6379> lrange list2 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 value0  #如果存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "value0"
127.0.0.1:6379> lset list 1 value2   #如果不存在,我们更新的话会报错
(error) ERR index out of range======================================================
#linsert #将某个具体的value插入到列表中某个元素的前边或者后边
127.0.0.1:6379> rpush list hello
(integer) 1
127.0.0.1:6379> rpush list world
(integer) 2
127.0.0.1:6379> linsert list before hello zjc #将某个具体的value插入到列表中某个元素的前边
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "zjc"
2) "hello"
3) "world"
127.0.0.1:6379> linsert list after world jw #将某个具体的value插入到列表中某个元素的后边
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "zjc"
2) "hello"
3) "world"
4) "jw"

小结

  • ·他实际上是一个链表,before Node after,left,right 都可以插入值 ·
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • ·如果移除了所有值,空链表,也代表不存在! ·在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点

list功能:消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)

Set(集合)

set无序不重复集合

127.0.0.1:6379> sadd set hello    #往set集合中添加值
(integer) 1
127.0.0.1:6379> sadd set zjc
(integer) 1
127.0.0.1:6379> sadd set jw
(integer) 1
127.0.0.1:6379> smembers set  #查看置顶set的所有值
1) "hello"
2) "jw"
3) "zjc"
127.0.0.1:6379> sismember set hello  #判断某一个值是不是在set集合当中(1为成功,0为失败)
(integer) 1
127.0.0.1:6379> sismember set world
(integer) 0
==============================================
127.0.0.1:6379> scard set  #查看set集合中元素的个数
(integer) 3
127.0.0.1:6379> smembers set
1) "hello"
2) "jw"
3) "zjc"
127.0.0.1:6379> srem set hello   #移除set集合中指定元素
(integer) 1
127.0.0.1:6379> smembers set
1) "jw"
2) "zjc"==========================================
#srandmember 随机从set中抽取一个元素
127.0.0.1:6379> smembers set  #查看set集合中的所有元素
1) "2"
2) "1"
3) "jw"
4) "zjc"
5) "3"
127.0.0.1:6379> srandmember set  #所及抽选出一个元素
"jw"
127.0.0.1:6379> srandmember set
"3"
127.0.0.1:6379> srandmember set 2    #所及抽选出指定个数的元素
1) "2"
2) "1"
127.0.0.1:6379> srandmember set 2
1) "zjc"
2) "1"
=================================
#spop 删除随机的key
127.0.0.1:6379> smembers set
1) "jw"
2) "zjc"
3) "2"
4) "3"
5) "1"
127.0.0.1:6379> spop set #所及删除set中的元素
"jw"
127.0.0.1:6379> spop set
"3"
127.0.0.1:6379> smembers set
1) "zjc"
2) "2"
3) "1"===================================
#smove 讲一个集合中指定的值移动到另一个集合当中
127.0.0.1:6379> smembers set
1) "zjc"
2) "2"
3) "1"
127.0.0.1:6379> sadd set2 set2
(integer) 1
127.0.0.1:6379> sadd set2 jw
(integer) 1
127.0.0.1:6379> smembers set2
1) "set2"
2) "jw"
127.0.0.1:6379> smove set set2 zjc   #讲一个集合中指定的值移动到另一个集合当中
(integer) 1
127.0.0.1:6379> smembers set
1) "2"
2) "1"
127.0.0.1:6379> smembers set2
1) "set2"
2) "zjc"
3) "jw"================================================
数学集合 差集 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> smembers set1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> smembers set2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sdiff set1 set2 #差集
1) "b"
2) "a"
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-map!这个时候值是一个map集合!本质上和String类型没有太大的区别,还是一个简单的kay-value键值对(不过这个value是一个key-value)

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset hash1 f1 zjc #set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget hash1 f1 #获取一个字段的值
"zjc"
127.0.0.1:6379> hmset hash1 f1 hello f2 jw #set多个key-value
OK
127.0.0.1:6379> hmget hash1 f1 f2    #获取多个字段值
1) "hello"
2) "jw"
127.0.0.1:6379> hgetall hash1    #获取全部的数据
1) "f1"
2) "hello"
3) "f2"
4) "jw"
127.0.0.1:6379> hdel hash1 f1    #删除hash指定key字段!对应value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"
127.0.0.1:6379> hgetall hash1
1) "f1"
2) "hello"
3) "f2"
4) "jw"
127.0.0.1:6379> hdel hash1 f1  #删除hash中特定的值
(integer) 0
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"=================================================
#heln hexists
127.0.0.1:6379> hgetall hash1
1) "f2"
2) "jw"
3) "f1"
4) "zjc"
127.0.0.1:6379> hlen hash1   #获取hash表的字段数量
(integer) 2
127.0.0.1:6379> hexists hash1 f1 #判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> hexists hash1 f3
(integer) 0================================
#hkeys hvals hincrby hsetnx
127.0.0.1:6379> hkeys hash1 #只获得所有的key
1) "f2"
2) "f1"
127.0.0.1:6379> hvals hash1  #只获得所有的value
1) "jw"
2) "zjc"
127.0.0.1:6379> hset hash1 f3 5
(integer) 1
127.0.0.1:6379> hget hash1 f3
"5"
127.0.0.1:6379> hincrby hash1 f3 1   #指定增量
(integer) 6
127.0.0.1:6379> hget hash1 f3
"6"
127.0.0.1:6379> hsetnx hash1 f4 hello #设置指定的值,如果不存在则创建并设置
(integer) 1
127.0.0.1:6379> hsetnx hash1 f4 world     #设置指定的值,如果存在则不能设置
(integer) 0
127.0.0.1:6379> hget hash1 f4
"hello"

Zset(有序集合)

在set的基础上,增加了一个值,set k1 v1 zset k1 score v1

127.0.0.1:6379> zadd set1 1 one       #添加一个值
(integer) 1
127.0.0.1:6379> zadd set1 2 two
(integer) 1
127.0.0.1:6379> zadd set1 3 three
(integer) 1
127.0.0.1:6379> zrange set1 0 -1 获取zset集合中的值
1) "one"
2) "two"
3) "three"==================================================
127.0.0.1:6379> zadd socre 5000 zjc  #添加三个用户
(integer) 1
127.0.0.1:6379> zadd socre 2500 jw
(integer) 1
127.0.0.1:6379> zadd socre 100 ly
(integer) 1
127.0.0.1:6379> zrangebyscore socre -inf +inf #显示全部的用户,从小到大
1) "ly"
2) "jw"
3) "zjc"
127.0.0.1:6379> zrevrange socre 0 -1 #显示全部的用户,从大到小排序
1) "jw"
2) "ly"
127.0.0.1:6379> zrangebyscore socre -inf +inf withscores    #显示全部的用户并且附带成绩
1) "ly"
2) "100"
3) "jw"
4) "2500"
5) "zjc"
6) "5000"
127.0.0.1:6379> zrangebyscore socre -inf 2500 withscores #显示指定区间的用户并升序排序
1) "ly"
2) "100"
3) "jw"
4) "2500"==============================================
#zrem zcard
127.0.0.1:6379> zrange socre 0 -1
1) "ly"
2) "jw"
3) "zjc"
127.0.0.1:6379> zrem socre zjc   #移除有序集合中指定元素
(integer) 1
127.0.0.1:6379> zrange socre 0 -1
1) "ly"
2) "jw"
127.0.0.1:6379> zcard socre  #获取有序集合中的个数
(integer) 2================================================
#zcount
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world
(integer) 1
127.0.0.1:6379> zadd myset 3 zjc
(integer) 1
127.0.0.1:6379> zcount myset 1 3     #获取指定区间成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

案例思路:set排序 存储班级成绩表 工资表排序
普通消息1 重要消息 2带权重进行判断
排行榜应用 取Top测试!

geospatial

朋友的定位,附近的人,打车距离计算?
Redis的Geo在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
可以查询一些测试数据:https://www.china95.net/paipan/jingdu/index.asp
规则:https://www.redis.net.cn/order/3685.html

  • getadd添加地理位置
#geoadd 添加地理位置
#规则:两级无法直接添加,我们一般会下载城市数据,直接通过
java程序一次性导入
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
#参数 key 值(维度、经度、名称)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 sahnghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.56 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
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 北京  #获取指定城市的经度和纬度
1) 1) "116.39999896287918091"2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city 深圳 西安
1) 1) "114.04999762773513794"2) "22.5200000879503861"
2) 1) "108.96000176668167114"2) "34.25999964418929977"
  • geodis:两人之间的距离

单位:如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
127.0.0.1:6379> geodist china:city 深圳 重庆  #查看深圳到重庆的直线距离
"1086757.1868"
127.0.0.1:6379> geodist china:city 上海 西安 km  #查看上海西安的直线距离
"1216.9307
  • georadius以给定的经纬度为中心,找出某一半径内的元素

我附近的人?(获取所有附近的人的地址、定位)通过半径来查询,所有的数据都录入:china:city

127.0.0.1:6379> georadius china:city 110 30 1000 km #以100,30这个经纬度为中心,方圆1000km的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist  #显示到中心距离的位置
1) 1) "chongqing"2) "341.3933"
2) 1) "xian"2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord #显示定位信息
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.56000053864853072"
2) 1) "xian"2) 1) "108.96000176668167114"2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord count 2 #筛选出指定的结果
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.56000053864853072"
2) 1) "xian"2) 1) "108.96000176668167114"2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord count 1
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.56000053864853072"
  • georadiusbymember找出指定元素周围的其他元素

和上面不同的是这个是通过元素来找,上面是通过定位来找

127.0.0.1:6379> georadius china:city 110 30 500 km withcoord count 1  找出指定元素周围的其他元素
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.56000053864853072"
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city sahnghai 400 km
1) "hangzhou"
2) "sahnghai"
  • geohash:将二维的经纬度转换为一维的字符串,如果两个字符串越接近的话,那么距离就越近
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm78pmnzmz0"

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

127.0.0.1:6379> zrange china:city 0  -1   #查看地图元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "sahnghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0  -1  #移除元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "sahnghai"

hyperloglog

基数:不重复的元素,比如{1.3.5.7.8}为5,可以接收误差

Redis 2.8.9版本就更新了Hyperloglog数据结构!
Redis Hyperloglog基数统计的算法!
优点:占用的内存是固定,2/64不同的元素的技术,只需要废12KB内有!如果要从内存角度来比较的话Hyperloglog首选!
网页的UV(一个人访问一个网站多次,但是还是算作一个人!)*
传统的方式,set保存用户的id,然后就可以统计 set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;

127.0.0.1:6379> pfadd key1 a b c d e f g h i j  #创建第一组元素 key1
(integer) 1
127.0.0.1:6379> pfcount key1 #统计 key1元素的基数信息
(integer) 10
127.0.0.1:6379> pfadd key2 i j z x c b n m
(integer) 1
127.0.0.1:6379> pfcount key2 #统计第二组 key2元素的基数
(integer) 8
127.0.0.1:6379> pfmerge key3 key1 key2   #合并两组  key1 key2  到 key3
OK
127.0.0.1:6379> pfcount key3 #查看并集的数量
(integer) 14

如果允许容错,那么一定使用 Hyperloglog!
如果不允许容错,就使用 set 挥着自己的数据类型即可!

bitmap

  • 位存储

统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps!
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!
365天=365bit 1字节=8bit 46个字节左右!

  • 用bitmaps来记录周一到周日的打开情况!

周一:1 周二:0…

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
  • 获取某一天的打卡情况
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0
  • 统计打卡天数
127.0.0.1:6379> bitcount sign
(integer) 3

Redis学习之旅--Redis的数据类型你都知道吗?相关推荐

  1. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  2. Redis学习(一)之redis简介

    文章目录 一.NoSQL 1.什么是NoSQL 2.NoSQL四大分类 二.Redis 1.什么是Redis 2.redis-benchmark 性能测试工具 3.Redis的五大数据类型和三种特殊数 ...

  3. Redis学习笔记(一) 数据类型事务异常Jredis

    Redis学习笔记(一) NoSql概述 Nosql四大分类 Redis入门 简介 Windows安装 基础使用 问题 Redis4.0之前为什么是单线程 单线程为什么这么快 Redis4.0后的多线 ...

  4. zset获取指定score_redis zset更新score redis学习笔记5 - Redis - 服务器之家

    redis zset更新score redis学习笔记5 发布时间:2017-04-03 来源:服务器之家 一:概述 zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的 ...

  5. redis学习(1)之redis基础和配置主从

    redis介绍 redis介绍 为什么会出现redis呢? redis特性 速度快 基于key-value 丰富的功能 简单稳定 支持的语言多 持久化 主从复制 redis应用场景 缓存 排行榜系统 ...

  6. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置

    0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...

  7. redis学习之三配置文件redis.conf 的含义

    摘自http://www.runoob.com/redis/redis-conf.html 安装redis之后的第一件事,我就开始配置密码,结果总是不生效,而我居然还没想到原因.今天突然用命令行设置了 ...

  8. 【转】Redis学习---阿里云Redis多线程性能增强版详解

    [原文]https://www.toutiao.com/i6594620107123589635/ 摘要 Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的 ...

  9. 【Redis学习03】redis缓存及其更新策略

    文章目录 1. 什么是缓存 2. 添加redis缓存 2.1 缓存商铺信息 3. 缓存更新策略 3.1 缓存更新策略方法 3.2 主动更新策略 3.3 缓存更新策略总结 4. 对商铺查询的缓存添加超时 ...

最新文章

  1. CF 1029E Tree with Small Distances
  2. React Native
  3. 域名与转发服务器ip指向不一致_域名映射到家庭网络(无公网IP)
  4. shiro框架采取MD5+salt方式加密密码
  5. React单页如何规划路由、设计Store、划分模块、按需加载
  6. C++函数概念解析(1)
  7. 三个不等_2道真题,讲透「基本不等式」的使用原则 | 真题精讲-11
  8. Redis的实现原理
  9. 大龄开发者正在消失?NO,听听这3位50岁程序员怎么说
  10. Delphi动态调用C++写的DLL
  11. Microsoft SilverLight
  12. 如何获取目标期刊的参考文献格式模板?
  13. 单片机4*4矩阵键盘的原理
  14. 四川农业大学计算机考研调剂,四川农业大学调剂基本条件
  15. linux小米随身wifi密码,Ubuntu用小米随身WiFi
  16. 2021计算机保研面试题目(纯干货)
  17. Mysql 默认密码
  18. C/S模式和B/S模式
  19. jason-2影像下载
  20. 《アニマル・ロジック》日语读书笔记1

热门文章

  1. 科研写作——常见句式(三)
  2. Ajax学习一 创建Ajax对象(高洛峰)
  3. SVAC国家标准介绍
  4. cnpm和npm使用,遇到的问题及解决方法
  5. 丧尸的世界·《丧尸西游》
  6. VS Code 所选驱动器或UNC共享不存在或不可访问。请另外选择
  7. 一篇文章解决所有的 #如何下载安装xshell链接VMware虚拟机liunx系统(如SentOS,ubuntu等等)# 等问题
  8. 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...
  9. 【Excel】给Excel生成工作表目录
  10. 【亲测成功】Ubuntu18.04升级GLIBC2.27——解决报错:ibc.so.6: version `GLIBC_2.28‘ not found