一、redis数据类型
Redis五大数据类型
Redis-key 、 String、List、Hash、Zset
Redis三种特殊数据类型
geospatial、hyperloglog、bitmaps
1.字符串String
127.0.0.1:6379> help @string #查看全部字符串
#1.设置值
127.0.0.1:6379> set name 丹
OK
--------------------------------------------------------------------------------
#2.获取值
127.0.0.1:6379> get name
丹
--------------------------------------------------------------------------------
#3.修改
127.0.0.1:6379> set name 丹姐
OK
127.0.0.1:6379> get name
丹姐
--------------------------------------------------------------------------------
#4.删除
127.0.0.1:6379> del name
1
127.0.0.1:6379> get name
--------------------------------------------------------------------------------
#5.判断一个key是否存在
127.0.0.1:6379> exists name
0 #0表示key不存在
127.0.0.1:6379> set name lll
OK
127.0.0.1:6379> exists name
1 #1表示key存在
--------------------------------------------------------------------------------
#6.过期时间
127.0.0.1:6379> TTL name #查看过期时间
-1 #永不过期
127.0.0.1:6379> TTL name
-2 # 已经过期了
127.0.0.1:6379> TTL name
3 # 剩下3秒钟就过期了
--------------------------------------------------------------------------------
#7.设置一个以毫秒为单位的过期时间
127.0.0.1:6379> set name dan px 10000
OK
--------------------------------------------------------------------------------
#8.设置一个以秒为单位的过期时间
127.0.0.1:6379> set name dan ex 10
OK
--------------------------------------------------------------------------------
#9.setex(set with expire)设置过期时间
127.0.0.1:6379> setex key3 30 "hello" #key+秒数+value
--------------------------------------------------------------------------------
#10.setnx(set if not exist)不存在则设置(在分布式锁中会常常使用)
127.0.0.1:6379> setnx key4 "mysql" #如果key4不存在,则创建,返回1
1
127.0.0.1:6379> setnx key4 "redis" #如果key4存在,则创建失败,返回0
0
--------------------------------------------------------------------------------
#14.设置多个值
127.0.0.1:6379> MSET b c d e f g
OK
127.0.0.1:6379> KEYS *
f
b
a
d
name
127.0.0.1:6379> get b
c
127.0.0.1:6379> get d
e
127.0.0.1:6379> get f
g
127.0.0.1:6379> msetnx a b c d #已设置过,创建失败
0
--------------------------------------------------------------------------------
#15.删除多个值
127.0.0.1:6379> KEYS *
1) "a"
2) "name"
3) "d"
127.0.0.1:6379> del a d
(integer) 2
127.0.0.1:6379> KEYS *
1) "name"
--------------------------------------------------------------------------------
#16.GETSET
(相当于get+set:先执行get命令,返回get结果,然后将key更新为新的value,下次再get的时候查到的就是新得value)
127.0.0.1:6379> GETSET name lalala
"qqq"
127.0.0.1:6379> get name
"lalala"
--------------------------------------------------------------------------------
#17.按照下标去更新 getset 先get再set
127.0.0.1:6379> GETSET name redis #如果不存在值,则返回nil
nil
127.0.0.1:6379> get name
“redis”
127.0.0.1:6379> SETRANGE name mysql #如果存在值,获取原来的值,并设置新的值
“redis”
127.0.0.1:6379> get name
”mysql“
--------------------------------------------------------------------------------
#18.获取多个key值
127.0.0.1:6379> MGET get name
lammlla
--------------------------------------------------------------------------------
#19.截取
127.0.0.1:6379> get name #截取name值的2-4位,从0开始数
lammlla
127.0.0.1:6379> GETRANGE name 2 4
mml"
127.0.0.1:6379> getrange name 0 -1 #获取全部的字符串 和get key是一样
--------------------------------------------------------------------------------
#20.计数
(Redis当中的计数器是具有原子性的)
127.0.0.1:6379> INCR num # 递增
1
127.0.0.1:6379> DECR num # 递减
0
--------------------------------------------------------------------------------
#21.指定长度递增(步长)
127.0.0.1:6379> incrby num 11
11
127.0.0.1:6379> incrby num 11
2
--------------------------------------------------------------------------------
#22.指定长度递减
127.0.0.1:6379> decrby num 11
12
--------------------------------------------------------------------------------
#23.追加字符串,如果当前key不存在,就相当于setkey
127.0.0.1:6379> get name
lammlla
127.0.0.1:6379> append name "hehe"
9
127.0.0.1:6379> get name
lammllahehe
--------------------------------------------------------------------------------
#24.截取字符串的长度
127.0.0.1:6379> strlen key1
7
127.0.0.1:6379> append key1 ",hello"
17
127.0.0.1:6379> strlen key1
17
--------------------------------------------------------------------------------
#25.替换
127.0.0.1:6379> set key1 abcdefg
ok
127.0.0.1:6379> get key1
"abcdefg"
127.0.0.1:6379> setrange key1 1 xx
(integer) 7
127.0.0.1:6379> get key1
"axxdefg"
--------------------------------------------------------------------------------
#对象
set user:1 {name:zhangdan,age:18} #设置一个user:1 ,对象值为json字符来保存一个对象
这里的key是一个巧妙的设计:user:(id):{filed}
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
ok
127.0.0.1:6379> mget user:1:name user:1:age
1)"zhangsan"
2)"2"
String总结
数据结构是相同的
String类似的使用场景:value除了是我们的字符串还可以是我们的数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
2.哈希Hash
#怎样用一个key存一个人的信息呢?
--------------------------------------------------------------------------------
#1.写入数据(set多个key-vlaue)
127.0.0.1:6379> hset people name cdan sex girl add guangzhou
3
--------------------------------------------------------------------------------
#2.获取数据
127.0.0.1:6379> hget people name
cdan
127.0.0.1:6379> hget people add
guangzhou
--------------------------------------------------------------------------------
#4.修改数据
127.0.0.1:6379> hset people name danjie
0
127.0.0.1:6379> hget people name
danjie
--------------------------------------------------------------------------------
#5.删除数据
127.0.0.1:6379> hdel people name
1
127.0.0.1:6379> hget people name
--------------------------------------------------------------------------------
#6.删除所有数据
127.0.0.1:6379> del people
1
127.0.0.1:6379> hget people name
(nil)
127.0.0.1:6379> hget people add
(nil)
--------------------------------------------------------------------------------
#7.获取多个值
127.0.0.1:6379> hset people name cdan sex girl add guangzhou
3
127.0.0.1:6379> hmget people name add sex
cdan
guangzhou
girl
--------------------------------------------------------------------------------
#8.获取所有的key和value
127.0.0.1:6379> hgetall people
name
cdan
sex
girl
add
guangzhou
--------------------------------------------------------------------------------
#9.获取所有的key
127.0.0.1:6379> hkeys people
name
sex
add
--------------------------------------------------------------------------------
#10.获取所有的value
127.0.0.1:6379> hvals people
cdan
girl
guangzhou
--------------------------------------------------------------------------------
#11.哈希类的计数(增加)
127.0.0.1:6379> hincrby people id 1
1
127.0.0.1:6379> hincrby people id 1
2
127.0.0.1:6379> hincrby people id 1
3
--------------------------------------------------------------------------------
#12.计数(递减)
127.0.0.1:6379> hget peopel id
"3"
127.0.0.1:6379> hincrby peopel id -1
-1
127.0.0.1:6379> hincrby peopel id -1
-2
--------------------------------------------------------------------------------
#13.计数(小数点)
127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
1.34
127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
2.68
127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
4.02
127.0.0.1:6379> HINCRBYFLOAT people num 10.9
134.09
127.0.0.1:6379> HINCRBYFLOAT people num 10.9
144.98999999999999999 # 精度不够
--------------------------------------------------------------------------------
#14.获取长度(获取hash表的字段数量)
127.0.0.1:6379> hlen peopel
2
--------------------------------------------------------------------------------
#15.获取某个字段的长度
127.0.0.1:6379> hstrlen peopel num
4
--------------------------------------------------------------------------------
#16.设置过期时间
17.0.0.1:6379> expire peopel 111
1
127.0.0.1:6379> ttl peopel # 查看过期时间
-2
--------------------------------------------------------------------------------
#17.判断hash中指定字段是否存在
17.0.0.1:6379> hexists myhash field1
1 #返回1代表存在
17.0.0.1:6379> hexists myhash field2
0 #返回0代表不存在
hash变更的数据user 那么 age,尤其是用户信息之类的,经常变动的信息!hash更适合于对象存储
3.列表List
redis列表就是redis的字符串类型的集合,按照插入顺序排序。list成栈,队列,阻塞队列
所有的list命令都是用L开头的
[root@redis01 ~]# redis-cli --raw
127.0.0.1:6379> auth 123
#1.从左边插入数据(后进先出,查看时是倒着来的)
127.0.0.1:6379> lpush peopel one #lpush是将一个或多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> lpush peopel two
(integer) 2
127.0.0.1:6379> lpush peopel three
(integer) 3
127.0.0.1:6379> lrange peopel 0 -1 #通过区间获取具体的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange peopel 0 1
1) "three"
2) "two"
--------------------------------------------------------------------------------
#2.从右边插入数据(先进先出)
127.0.0.1:6379> rpush peopel abc #在原有的基础上插入到队列的 最后一个位置(右)
(integer) 4
127.0.0.1:6379> lrange peopel 0 -1
1) "three"
2) "two"
3) "one"
4)"abc"
--------------------------------------------------------------------------------
#3.查看数据
127.0.0.1:6379> lrange peopel 0 -1 #从开始到结束
1) "beijing"
2) "man"
3) "yyy"
4) "yyy"
5) "abc"
127.0.0.1:6379> lrange peopel 2 4 #从第二位到第四位
1) "yyy"
2) "yyy"
3) "abc"
--------------------------------------------------------------------------------
#4.从左边追加数据(与sting类型中的nx类似,只有当list存在时才会从左边依次追加元素)
127.0.0.1:6379> lrange peopel 0 -1
1) "beijing"
2) "man"
3) "yyy"
4) "yyy"
5) "abc"
127.0.0.1:6379> lpushx peopel 345 #从头部追加345
(integer) 6
127.0.0.1:6379> lrange peopel 0 -1
1) "345"
2) "beijing"
3) "man"
4) "yyy"
5) "yyy"
6) "abc"
--------------------------------------------------------------------------------
#5.从右边追加数据(只有当list存在时才会从右边依次追加元素)
127.0.0.1:6379> lrange peopel 0 -1
1) "345"
2) "beijing"
3) "man"
4) "yyy"
5) "yyy"
6) "abc"
127.0.0.1:6379> rpushx peopel 123 #从尾部追加123
(integer) 7
127.0.0.1:6379> lrange peopel 0 -1
1) "345"
2) "beijing"
3) "man"
4) "yyy"
5) "yyy"
6) "abc"
7) "123"
--------------------------------------------------------------------------------
#6.在某个key的前面或者后面追加一个数据
127.0.0.1:6379> lrange peopel 0 -1
1) "345"
2) "beijing"
3) "man"
4) "yyy"
5) "yyy"
6) "abc"
7) "123"
127.0.0.1:6379> linsert peopel before beijing 111 #在北京的前边添加111
(integer) 8
127.0.0.1:6379> lrange peopel 0 -1
1) "345"
2) "111"
3) "beijing"
4) "man"
5) "yyy"
6) "yyy"
7) "abc"
8) "123"
127.0.0.1:6379> linsert people after world 123 456
9) "456"
--------------------------------------------------------------------------------
#7.移除list集合中指定个数的value,精确匹配
127.0.0.1:6379> lrange peopel 0 -1
123
beijing
shanghai
man
yyy
127.0.0.1:6379> lrem peopel 1 123 #从列表左侧开始删除1个123
(integer) 1
127.0.0.1:6379> lrange peopel 0 -1
beijing
shanghai
man
yyy
--------------------------------------------------------------------------------
#8.修改数据(将列表中指定下标的值替换为另外一个值,更新操作)
127.0.0.1:6379> lrange peopel 0 -1
123
23
man
yyy
127.0.0.1:6379> lset list 0 item #如果不存在列表我们去更新就会报错
(error)ERR no such key
127.0.0.1:6379> lset peopel 1 beijing #如果存在,更新指定第1位修改成beijing
OK
127.0.0.1:6379> lrange peopel 0 -1
123
beijing
man
yyy
--------------------------------------------------------------------------------
#9.截取字符串
127.0.0.1:6379> lrange peopel 0 -1
123
beijing
man
yyy
127.0.0.1:6379> ltrim peopel 1 3 #截取从1到3,这个list已经被改变了,截断了只剩下截取的元素
OK
127.0.0.1:6379> lrange peopel 0 -1
beijing
man
yyy
--------------------------------------------------------------------------------
#10.返回列表的长度LLEN
127.0.0.1:6379> llen peopel
3
127.0.0.1:6379> LRANGE peopel 0 -1
beijing
man
yyy
--------------------------------------------------------------------------------
##11.通过下标lindex获得list中的某一个值
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 0
"two"
--------------------------------------------------------------------------------
#12.从左边开始消费(lpop移除list的第一个元素)
127.0.0.1:6379> lrange peopel 0 -1
1) "man"
2) "yyy"
3) "xxx"
127.0.0.1:6379> lpop peopel
"man"
127.0.0.1:6379> lrange peopel 0 -1
1) "yyy"
2) "xxx"
--------------------------------------------------------------------------------
#13.从右边开始消费(rpop移除list的最后一个元素)
127.0.0.1:6379> lrange peopel 0 -1
1) "yyy"
2) "xxx"
127.0.0.1:6379> rpop peopel
"xxx"
127.0.0.1:6379> lrange peopel 0 -1
1) "yyy"
--------------------------------------------------------------------------------
#14.消费一个元素追加另一个列表里 (从尾开始)
或者说是:# rpoplpush移除列表中最后一个元素到新的列表中
127.0.0.1:6379> lrange peopel 0 -1
1) "555"
2) "444"
3) "333"
4) "222"
5) "111"
6) "111"
127.0.0.1:6379> rpoplpush peopel newlist
"111"
127.0.0.1:6379> lrange peopel 0 -1 #查看原来的列表
1) "555"
2) "444"
3) "333"
4) "222"
5) "111"
127.0.0.1:6379> lrange newlist 0 -1 #查看目标列表,确实存在改值
1) "111"
--------------------------------------------------------------------------------
#15.实时获取某一个值
127.0.0.1:6379> blpop peopel 1000
peopel
man
127.0.0.1:6379> blpop peopel 1000
list小结
- 他实际上是一个链表,before node after ,left,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
- 消息队列(lpush rpop),栈(lpush lpop)
4.无序集合Set
Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40多亿个成员)。
set的值是不能重复读的
#1.增加数据(set集合中添加元素)
127.0.0.1:6379> sadd mysqlset 1
(integer) 1
127.0.0.1:6379> sadd mysqlset 12
(integer) 1
--------------------------------------------------------------------------------
#2.查看数据(查看指定set的所有值
127.0.0.1:6379> smembers mysqlset
1) "1"
2) "12"
3) "123"
--------------------------------------------------------------------------------
#3.删除数据(移除set集合中的指定元素)
127.0.0.1:6379> smembers mysqlset
1
2
4
127.0.0.1:6379> srem mysqlset 1
1
127.0.0.1:6379> smembers mysqlset
2
4
--------------------------------------------------------------------------------
#4.移动数据
127.0.0.1:6379> sadd myset "hello"
1
127.0.0.1:6379> sadd myset "world"
1
127.0.0.1:6379> sadd myset "cdan"
1
127.0.0.1:6379> sadd myset2 "haha"
1
127.0.0.1:6379> smove myset myset2 "cdan" #将一个指定的值,移动到另外一个set集合
1
127.0.0.1:6379> smembers myset
"hello"
"world"
127.0.0.1:6379> smembers myset2
"cdan"
"haha"
--------------------------------------------------------------------------------
#5.返回集合当中的个数
127.0.0.1:6379> smembers myset
1) "qqq"
2) "1234"
127.0.0.1:6379> scard myset
(integer) 2
--------------------------------------------------------------------------------
#6.随机返回两个数据
127.0.0.1:6379> srandmember mysqlset 2
1) "12345"
2) "1"
--------------------------------------------------------------------------------
#7.判断一个数据是否存在一个集合中
127.0.0.1:6379> sismember mysqlset abc
(integer) 0 #不存在返回0
127.0.0.1:6379> sismember mysqlset 12
(integer) 1 #存在返回1
--------------------------------------------------------------------------------
#8.随机删除一些set集合中的元素spop
127.0.0.1:6379> smembers mysqlset
1) "1"
2) "12"
3) "12345"
127.0.0.1:6379> spop mysqlset 1
1) "12"
127.0.0.1:6379> smembers mysqlset
1) "1"
2) "12345"
--------------------------------------------------------------------------------
#9.返回多个集合中的交集
127.0.0.1:6379> sadd myseta 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd mysetb 1 2 3 7 8 9
(integer) 6
127.0.0.1:6379> sinter myseta mysetb mysetc
1) "1"
2) "2"
3) "3"
--------------------------------------------------------------------------------
#10.返回多个集合的并集
127.0.0.1:6379> sadd myseta 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd mysetc 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> sunion myseta mysetb mysetc
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
--------------------------------------------------------------------------------
#11.返回多个集合的差集
127.0.0.1:6379> sadd myseta 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd mysetb 1 2 3 7 8 9
(integer) 6
127.0.0.1:6379> sadd mysetc 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> sdiff mysetc mysetb myseta
1) "6"
场景:
微博,A用户将 所有关注的人放在一个set集合中!将他的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
5.有序集合Zset
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一 个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的, 但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大 的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40多亿个成员)。
#1.添加数据
127.0.0.1:6379> zadd nn 1 one 2 two
1
127.0.0.1:6379> zadd nn 123 tree
1
127.0.0.1:6379> zadd nn 3 twos
(integer) 1
--------------------------------------------------------------------------------
#2.查看数据
127.0.0.1:6379> zrange nn 0 -1
one
two
twos
tree
--------------------------------------------------------------------------------
#3.排序
127.0.0.1:6379> zadd salary 2500 xiaoming #添加3个用户及薪水
(integer) 1
127.0.0.1:6379> zadd salary 500 xiaole
(integer) 1
127.0.0.1:6379> zadd salary 5000 xiaomiao
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #升序,显示所有的用户名
1) "xiaole"
2) "xiaoming"
3) "xiaomiao"
127.0.0.1:6379> zrevrange salary 0 -1 #降 序,显示所有的用户名
1) "xiaomiao"
2) "xiaoming"
3) "xiaole"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示全部的用户并且附带成绩
1) "xiaole"
2) "500"
3) "xiaoming"
4) "2500"
5) "xiaomiao"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #显示工资小于2500的员工的升序
... ...
--------------------------------------------------------------------------------
#4.删除数据
127.0.0.1:6379> zrange nn 0 -1
one
two
tree
127.0.0.1:6379> zrem nn one #移除有序集合中的指定元素
1
127.0.0.1:6379> zcard nn #获取有序集合中的个数
2
#5.获取指定区间的成员数量
127.0.0.1:6379> zcount myset 1 3
3
案例思路:set 排序 存储班级成绩表,工资表排序
普通消息---1,重要消息--2,带权重进行判断
排行榜应用实现,取Top N测试
6. Geospatial地理位置
朋友的定位,附件的人,打车距离计算
Redis的Geo在Redis3.2版本就推出这些功能
可以查询一些测试数据:(http://www.jsons.cn/lngcode/)
geoadd
添加地理位置
官网([Redis GEOADD 命令_将指定的地理空间位置(纬度、经度、名称)添加到指定的key中] (https://www.redis.net.cn/order/3685.html))
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误
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 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 4
geopos
获得当前定位:一定是一个坐标值
127.0.0.1:6379> geopos china:city beijing #获取指定的城市的经度和纬度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city shanghai chongqin
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
geodist
两人之间的距离
单位:
- m 表示单位为米
- km 千米
- mi 英里
- ft 英尺
127.0.0.1:6379> geodist china:city beijing shanghai km #查看北京到上海的距离
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqin km
"1464.0708"
georadius
以给定的经纬度为中心,找出某一半径内的元素
我附近的人?(获得所有附近的人地址,定位)通过半径来查询
#先定义集合,再查找。之前已把所有的数据都录入china:city
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqin" #以110 30这个经纬度为中心,寻找方圆1000km内的城市
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist #显示到中间距离的位置
1) 1) "chongqin"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord #显示他人的定位信息
1) 1) "chongqin"
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 110 30 500 km withdist withcoord count 2
# 筛选出指定的结果
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
georadiusbymember
找出位于指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
geohash
返回一个或多个位置元素的geohash表示,该命令将返回11个字符的geohash的字符串(了解即可)
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近
2) "wm5xzrybty0"
原理
Geo底层的实现原理其实就是zset,我们可以使用zset命令来操作geo
127.0.0.1:6379> zrange china:city 0 -1 #查看地图中全部的元素
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing #移除指定的元素
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
7. Hyperloglog 基数统计
基数:不重复的元素
8. Bitmaps位存储
统计用户信息,活跃、不活跃。登录、未登录。打卡,365打卡。两个状态的都可以使用
Bitmaps位图,数据结构。都是操作二进制位来进行记录,就只有0和1两个状态
365天=365bit 1字节=8bit 46个字节左右
#使用bitmap来记录周一到周日的打卡
周一:1 周二:0 周三:1 ... ...
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 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 6
(integer) 0
---------------------------------------------
#统计这周打卡的记录,就可以看到是否有全勤
127.0.0.1:6379> bitcount sign
(integer) 3
二、Redis常用命令
1.查看所有key
127.0.0.1:6379> keys *
myseta
mysqlset
myset
mysetc
nn
num
name
2.查看key的类型
127.0.0.1:6379> type nn
zset #有序集合
127.0.0.1:6379> type name
string #字符串
127.0.0.1:6379> type peopel
list #列表
3.随机返回一个key
127.0.0.1:6379> RANDOMKEY
num
127.0.0.1:6379> RANDOMKEY
myset
127.0.0.1:6379> RANDOMKEY
nn
4.删除key
127.0.0.1:6379> del name
(integer) 1 #返回状态0/1,true/false
127.0.0.1:6379> keys *
1) "newlist"
2) "myset"
3) "mysetb"
4) "myset1"
5) "peopel"
6) "myseta"
7) "people"
8) "age"
9) "mysetc"
10) "mysqlset"
5.判断一个key是否存在
127.0.0.1:6379> exists name
(integer) 0 #不存在返回0
127.0.0.1:6379> exists peopel
(integer) 1 #存在返回1
6.重命名一个key
127.0.0.1:6379> rename myset myset0
OK
7.查看key的剩余时间
#1.以秒为单位
127.0.0.1:6379> ttl peopel
(integer) -1 #-1永不过期
#2.以毫秒为单位
127.0.0.1:6379> pttl peopel
(integer) -1 #-1永不过期
8.清空数据库(flushdb)
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> flushdb #清空当前的数据库
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[2]> flushall # 清空所有数据库的数据
OK