首页 > 其他 > 详细

redis五大数据类型+三种特殊数据类型

时间:2020-07-16 00:42:00      阅读:62      评论:0      收藏:0      [点我收藏+]

五大数据类型

redis是一个开源的(BSD许可的)内存数据结构存储,用作数据库、缓存和消息代理。它支持字符串、散列、列表、集合、带范围查询的排序集、位图、超日志、具有RADIUS查询和流的地理空间索引等数据结构。Redis内置了复制、Lua脚本、LRU驱逐、事务处理和不同级别的磁盘上持久化,并通过Redis Sentinel和Redis集群自动分区提供了高可用性。

redis-key

127.0.0.1:6379[3]> keys *
1) "age"
2) "name"
127.0.0.1:6379[3]> exists name #判断当前key是否存在,存在返回1,不存在返回0
(integer) 1
127.0.0.1:6379[3]> exists name1
(integer) 0
127.0.0.1:6379[3]> move name 1 #移除key
(integer) 1
127.0.0.1:6379[3]> keys *
1) "age"
127.0.0.1:6379[3]> set name yang
OK
127.0.0.1:6379[3]> expire name 10 #为key设置过期时间,单位是秒
(integer) 1
127.0.0.1:6379[3]> ttl name  #查看key的剩余时间
(integer) 6
127.0.0.1:6379[3]> ttl name
(integer) 1
127.0.0.1:6379[3]> get name
(nil)
127.0.0.1:6379[3]> type name #查看key的类型
none
127.0.0.1:6379[3]> type age
string
127.0.0.1:6379[3]>

String(字符产)

127.0.0.1:6379> set name aa
OK
127.0.0.1:6379> append name bb #追加字符串,如key不存在,则相当于set name
(integer) 4
127.0.0.1:6379> get name
"aabb"
127.0.0.1:6379> strlen name #查看字符串长度
(integer) 4
#########################################################################################
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> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views #自减1
(integer) 1
127.0.0.1:6379> decr views
(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> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 5 #设置指定减量
(integer) 15
127.0.0.1:6379> get views
"15"
#########################################################################################
127.0.0.1:6379> set key hello,string
OK
127.0.0.1:6379> get key
"hello,string"
127.0.0.1:6379> getrange key 0 3 #截取字符串0,3
"hell"
127.0.0.1:6379> getrange key 0 -1 #获得全部字符串
"hello,string"
127.0.0.1:6379> setrange key 2 p #替换指定位置字符串
(integer) 12
127.0.0.1:6379> get key
"heplo,string"
#########################################################################################
# setex (set with expire)   # 设置过期时间
# setnx (set if not exist)   # 不存在在设置 (在分布式锁中会常常使用!)
127.0.0.1:6379> setex key2 20 hello #设置过期时间
OK
127.0.0.1:6379> get key2
"hello"
127.0.0.1:6379> ttl key2
(integer) -2
127.0.0.1:6379> setnx key3 hello2 #不存在才设置
(integer) 1
127.0.0.1:6379> setnx key3 MongoDB  # 如果key3存在,创建失败!
(integer) 0
127.0.0.1:6379> get key3
"hello2"
127.0.0.1:6379> keys *
1) "myhash:{tag}:__rand_int__"
2) "mylist:{tag}"
3) "key3"
4) "name"
5) "key"
6) "key:{tag}:__rand_int__"
7) "counter:{tag}:__rand_int__"
8) "views"
#########################################################################################
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 a k2 b k3 c #设置多值
OK
127.0.0.1:6379> mget k1 k2 k3 #获取多值
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> msetnx k1 w k4 d # msetnx 是一个原子性的操作,要么一起成功,要么一起失败!
(integer) 0
127.0.0.1:6379> get k4
(nil)
?
# 对象
set user:1 {name:zhangsan,age:3}  # 设置一个user:1 对象 值为 json字符来保存一个对象!
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了!
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
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 mongodb  # 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
?

数据结构是相同的! String类似的使用场景:value除了是我们的字符串还可以是我们的数字! 计数器

统计多单位的数量

粉丝数

对象缓存存储

 

list(集合)

技术分享图片

栈,队列,阻塞队列

所有list命令都已l开头,头进屁股出

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
127.0.0.1:6379> lrange list 0 -1 #取出list中所有值
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 four  #把值插入屁股
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list #移除头部的值
"three"
127.0.0.1:6379> rpop list #移除尾部的值
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 #通过下标获取list中某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> llen list #返回列表长度
(integer) 2
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "two"
3) "one"
127.0.0.1:6379> lrem list 2 two #移除指定的值,2是数量,移除两个two
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
#########################################################################################
127.0.0.1:6379> lpush mylist aa
(integer) 1
127.0.0.1:6379> lpush mylist bb
(integer) 2
127.0.0.1:6379> lpush mylist cc
(integer) 3
127.0.0.1:6379> lpush mylist dd
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "dd"
2) "cc"
3) "bb"
4) "aa"
127.0.0.1:6379> ltrim mylist 1 2 #修剪,截取指定字符串,其他元素删除
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "cc"
2) "bb"
#########################################################################################
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> rpoplpush mylist myotherlist  # 移除列表的后一个元素,将他移动到新的 列表中! "hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1  # 查看目标列表中,确实存在改值!
1) "hello2"
#########################################################################################
127.0.0.1:6379> flushdb #清空数据库
OK
127.0.0.1:6379> lpush list aa
(integer) 1
127.0.0.1:6379> lset list 0 item #更新list中的值,list不存在,就会报错
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
#########################################################################################
linsert # 将某个具体的value插入到列把你中某个元素的前面或者后面!
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "world"
(integer) 2
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"
127.0.0.1:6379> LINSERT mylist after world new
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new

 

set(集合)

127.0.0.1:6379> sadd myset hello1 #set集合中添加值
(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> SMEMBERS myset #查看set集合中的值
1) "hello3"
2) "hello1"
3) "hello2"
127.0.0.1:6379> sismember myset hello2 #判断某一个值是否在set集合中,是返回1,不是返回0
(integer) 1
127.0.0.1:6379> sismember myset hello6
(integer) 0
#########################################################################################
127.0.0.1:6379> scard myset#获取set集合中内容元素个数
(integer) 3
#########################################################################################
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> SRANDMEMBER myset#随机抽取一个元素
"hello2"
127.0.0.1:6379> SRANDMEMBER myset
"hello1"
127.0.0.1:6379> SRANDMEMBER myset
"hello1"
127.0.0.1:6379> SRANDMEMBER myset 2 #随机抽取指定个数的元素
1) "hello3"
2) "hello2"
#########################################################################################
127.0.0.1:6379> spop myset
"hello1"
127.0.0.1:6379> spop myset #随机删除一个set中的元素
"hello2"
127.0.0.1:6379> smembers myset
1) "hello3"
127.0.0.1:6379>
#########################################################################################
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> smove myset myset2 hello2 #将一个set集合中的值移动到另一个set集合中
(integer) 1
127.0.0.1:6379> smembers myset2
1) "hello2"
127.0.0.1:6379> smembers myset
1) "hello3"
2) "hello1"
#########################################################################################
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset b
(integer) 1
127.0.0.1:6379> sadd myset c
(integer) 1
127.0.0.1:6379> sadd myset2 c
(integer) 1
127.0.0.1:6379> sadd myset2 d
(integer) 1
127.0.0.1:6379> sadd myset2 e
(integer) 1
127.0.0.1:6379> sdiff myset myset1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> SINTER myset myset2 #交集
1) "c"
127.0.0.1:6379> sdiff myset myset2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sunion myset myset2 #并集
1) "c"
2) "a"
3) "b"
4) "e"
5) "d"
127.0.0.1:6379>
?

Hashmap(哈希)

127.0.0.1:6379> hset myhash field1 yang #set一个具体ket-value
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个字段值
"yang"
127.0.0.1:6379> hmset myhash field1 hello1
OK
127.0.0.1:6379> hmset myhash field1 hello1 field2 hello2 #set多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2 #获取多个字段值
1) "hello1"
2) "hello2"
127.0.0.1:6379> hgetall myhash #获取全部数据
1) "field1"
2) "hello1"
3) "field2"
4) "hello2"
127.0.0.1:6379> hdel myhash field1 #删除key字段,value也会消失
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "hello2"
#########################################################################################
127.0.0.1:6379> hlen myhash #获取hash中的字段数量
(integer) 1
#########################################################################################
127.0.0.1:6379> hkeys myhash #获取所有的key
1) "field2"
127.0.0.1:6379> hvals myhash #获取所有的value
1) "hello2"
#########################################################################################
incr decr
127.0.0.1:6379> hset myhash field3 4
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1  #指定增量
(integer) 5
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 3
127.0.0.1:6379> hsetnx myhash field4 hello5 #如果key不存在,能设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello6 #如果key存在,不能设置
(integer) 0
?

Zset(有序集合)

127.0.0.1:6379> zadd myset 1 one #添加1个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1 # 查看所有值
1) "one"
2) "two"
3) "three"
#########################################################################################
127.0.0.1:6379> zadd salary 2500 yang #添加3个用户
(integer) 1
127.0.0.1:6379> zadd salary 3000 zhi
(integer) 1
127.0.0.1:6379> zadd salary 1000 cheng
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #从小到大排序
1) "cheng"
2) "yang"
3) "zhi"
127.0.0.1:6379> ZREVRANGE salary 0 -1 #从大到小排序
1) "zhi"v
2) "yang"
3) "cheng"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #从小到大排序并且附带成绩
1) "cheng"
2) "1000"
3) "yang"
4) "2500"
5) "zhi"
6) "3000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #显示工资小于2500升序
1) "cheng"
2) "1000"
3) "yang"
4) "2500"
#########################################################################################
127.0.0.1:6379> ZRANGE salary 0 -1
1) "cheng"
2) "yang"
3) "zhi"
127.0.0.1:6379> zrem salary cheng #移除指定元素
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "yang"
2) "zhi"
127.0.0.1:6379> ZCARD salary #查看元素数量
(integer) 2
#########################################################################################
127.0.0.1:6379> zadd myset 1 hello1
(integer) 1
127.0.0.1:6379> zadd myset 2 hello2
(integer) 1
127.0.0.1:6379> zadd myset 3 hello3
(integer) 1
127.0.0.1:6379> ZCOUNT myset 1 3 #获取指定区间成员数量
(integer) 3
127.0.0.1:6379> ZCOUNT myset 0 2
(integer) 2

三种特殊数据类型

Geospatial 地理位置

geoadd添加地理位置

?
# geoadd添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。    
   # 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin (error) ERR invalid longitude,latitude pair 39.900000,116.400000
(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 shengzhen#添加多个
(integer) 2

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 beijing chongqing
1) 1) "116.39999896287918091"
  2) "39.90000009167092543"
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"

georedius 以经纬度查看周围半径内的元素

例:附近的人

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以110,30 这个经纬度为中心,寻 找方圆1000km内的城市 
1) "chongqing"
2) "shengzhen"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist # 显示到中间距离的位置
1) 1) "chongqing"
  2) "341.9374"
2) 1) "shengzhen"
  2) "924.6408"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord #查看附近城市信息
1) 1) "chongqing"
  2) "341.9374"
  3) 1) "106.49999767541885376"
     2) "29.52999957900659211"
2) 1) "shengzhen"
  2) "924.6408"
  3) 1) "114.04999762773513794"
     2) "22.5200000879503861"
?
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 1  # 筛选出指定的结果!
1) 1) "chongqing"
  2) "341.9374"
  3) 1) "106.49999767541885376"
     2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 2
1) 1) "chongqing"
  2) "341.9374"
  3) 1) "106.49999767541885376"
     2) "29.52999957900659211"
2) 1) "shengzhen"
  2) "924.6408"
  3) 1) "114.04999762773513794"
     2) "22.5200000879503861"
?

GEORADIUSBYMEMBER 以元素为中心找周围其他元素

127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 2000 km#找出周围半径内2000km的城市
1) "chongqing"
2) "shengzhen"
3) "shanghai"
4) "beijing"

GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示

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

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

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

127.0.0.1:6379> ZRANGE china:city 0 -1  #查看地图中全部的元素 
1) "chongqing"
2) "shengzhen"
3) "shanghai"
4) "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) "shengzhen"
3) "shanghai"

 

Hyperloglog 统计基数

什么是基数?

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

B{13,5,7,8} 基数(不重复的元素) = 5,可以接受误差!

127.0.0.1:6379> PFADD mykey a b c d e #创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #查看基数
(integer) 5
127.0.0.1:6379> PFADD mykey2 e f g h
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 4
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #并集:把mykey和mykey2合并
OK
127.0.0.1:6379> PFCOUNT mykey3#查看并集基数
(integer) 8
?

Bitmap

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

365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

 

使用bitmap 来记录 周一到周日的打卡!

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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> getbit sign 2#查看具体某天是否打卡
(integer) 1
127.0.0.1:6379> bitcount sign #统计打卡天数
(integer) 6
?

 

redis五大数据类型+三种特殊数据类型

原文:https://www.cnblogs.com/yang-1023/p/13311236.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!