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

Redis五大数据类型

  • String
  • List
  • Set
  • Hash
  • Zset

Redis官方介绍

  • Redis是内存中的数据结构存储系统,可以作用数据库、缓存、消息中间MQ
  • 支持多种数据类型
    • String字符串
    • hash散列
    • list列表
    • set 集合
    • sorted sets有序集合
    • bimemaps
    • hyperloglog
    • geospatial
  • Redis内置了主从复制replication、LUAscripting脚本,LRU 驱动事件,transactions事务,和不同级别的磁盘持久化persistence
  • 通过Redis哨兵Sentinel,和自动分区Cluster,提供高可用性high availability

Redis

  • redis-server &
    #后台启动
    redis-server   /etc/local/bin/redis.conf
    #指定文件启动
    -p
    #指定端口启动
    
  • keys * 查询全部key

  • select 3 切换数据库3

  • dbsize 查看数据库大小

  • flushdb 清空当前库

  • flushall 清空所有数据

  • exists 判断某个key是否存在

  • move 移除key

  • expire 设置过期时间,可以用作单点登录

  • ttl 查看过期时间

  • type 查看key的类型

  • config set requirepass XXX 设置密码

    • config set requirepass “” 取消密码
  • auth xxx 登录

String

  • append 追加value

    • 追加不存在的key会set key
  • strlen 查看value长度

  • incr 自增1,可以用作增加浏览量increase

  • decr decrease 递减

  • incrby 能设置自增量的自增

  • getrange 截取范围,下标从0开始

  • setrange 修改范围的值

  • setex set wth expire 设置key时顺便设置生存时间

  • setnx ( set if not exist )参数不存在就设置,在分布式锁经常使用,如果存在就创建失败

  • mset 批量设置,空格间隔

  • mget

  • msetnx 原子性操作,批量设置

  • 对象操作

    • 127.0.0.1:6379> mset user:1:name lwh user:1:age 3
      OK
      127.0.0.1:6379> mget user:1:name user:1:age
      1) "lwh"
      2) "3"
      127.0.0.1:6379> 
      
    • 设置一个对象,值为json字符串来保存一个对象

    • user:{id}:{filed}

  • getset 先get再set,规则就按getset来,无论key存不存在,都按getset来

List

在Redis中可以将List作为、栈、队列、阻塞队列

  • 实际上是一个链表,left、right 都可以插入值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增value
  • 移除所有值,空链表
  • 在两边插入效率最高,对中间元素操作,效率会降低

消息排队、消息队列、堆、栈

  • lpush left push
  • lrange 显示list 范围range
  • rpush right push
  • Rpop right pop
  • Lpop left pop
  • Llen listlength
  • lrem remove指定下标
  • ltrim trim截取
  • Rpoplpush pop再push到别的list
  • lset 设置指定下表值
  • exists 存在
  • Linsert 将某个具体的value插入到某个元素的前面或后面
#=======================================================================

# lpush、lrange、Rpush
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      #获取全部的值从0到-1,这是作为栈的最顶上的为index 0,
1) "three"
2) "two"
3) "one"
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"



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

#Rpop、Lpop   移出元素      lindex 获取下标对应值
127.0.0.1:6379> rpop list
"Right"
127.0.0.1:6379> lindex list 2
"one"

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

#  返回llen 长度\    lrem   移除
127.0.0.1:6379> llen list
(integer) 3


127.0.0.1:6379> lrem list 2 three    #lrem key count value  移除几个,从左边删除的
(integer) 1

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

#ltrim   截取范围,其余的删除
127.0.0.1:6379> rpush list l1
(integer) 1
127.0.0.1:6379> rpush list l2
(integer) 2
127.0.0.1:6379> rpush list l3
(integer) 3
127.0.0.1:6379> rpush list l4
(integer) 4
127.0.0.1:6379> ltrim list 2 3
OK
127.0.0.1:6379> lrange list 0 -1
1) "l3"
2) "l4"
127.0.0.1:6379>
########################################################################

#rpoplpush  从一个list 的最右边的一个值pop出来push进别的list中
127.0.0.1:6379> rpush list 4 5 6
(integer) 6
127.0.0.1:6379> lrange list 
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpoplpush list destination
"6"

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

#linsert   在之前或之后插入
127.0.0.1:6379> linsert list before 3 inserttest  #插入在3之前
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "value"
2) "2"
3) "inserttest"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> linsert list after 4 inserttest2  #插入在4之后
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "value"
2) "2"
3) "inserttest"
4) "3"
5) "4"
6) "inserttest2"
7) "5"
127.0.0.1:6379> 

Set

集合中的值不能重复,set是无需不重复原则

string和list的元素都是value,set中是member

  • sadd
  • smembers 查看集合的全部值
  • sismember 判断是否存在
  • scard 查看一共有几个元素
  • srem 移除某一个member
  • srandmember 随机抽取几个member
  • spop 随机删除几个member
  • smove 移动member到另一个set,可以适用于共同关注功能实现
  • sdiff difference set 差集 ,结果来自first_key为基准
  • sinter intersection set 交集
  • sunion union联合 并集
    • 将用户放到set中,共同关注、共同爱好、推荐好友
127.0.0.1:6379> smembers set1
1) "m4"
2) "m3"
3) "m1"
4) "m2"
127.0.0.1:6379> smembers set2
1) "m3"
2) "m6"
3) "m1"
4) "m2"
5) "m5"
127.0.0.1:6379> sdiff set1 set2
1) "m4"
127.0.0.1:6379> sinter set1 set2 
1) "m3"
2) "m1"
3) "m2"
127.0.0.1:6379> 

Hash

map集合,key - map 本质和string类型没有太大区别,还是一个简单的key - value,像是增加了一层

  • hset hset key field value

  • hget

  • hmset

  • hmget

  • hmget

  • Hmget

  • Hdel 删除

  • hgetall

  • hlen

  • hexists 判断hash中指定字段是否存在

  • hkeys 获取key所有的field

  • hvals 获取所有的value

  • hincrby 递增,参数设置为负数就是递减

  • hsetnx 是否存在,不存在就创建设置,存在就不设置

  • 127.0.0.1:6379> hset user:1 name haoyun
    (integer) 1
    127.0.0.1:6379> hget user:1 name
    "haoyun"
    
  • 做用户信息保存,比用string类型好点,存储经常变动的信息,hash更适合存储对象,

127.0.0.1:6379> hset key field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hmset key field1 field2
OK
127.0.0.1:6379> hmget key 
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> hmget key *
1) (nil)
127.0.0.1:6379> hmget key field1 field2
1) "field2"
2) "value2"
127.0.0.1:6379> 

ZSet

在set的基础上增加了一个值

可以作为一个排行榜功能,进场刷新,或者任务等级排序之类的,都可以做

  • image-20201120225008987

  • 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"
    127.0.0.1:6379> 
    
  • 排序

  • zrangebyscore

    127.0.0.1:6379> zadd salary 3000 hao 2000 yun 100 lwh 
    (integer) 3
    127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #与分数
    1) "lwh"
    2) "100"
    3) "yun"
    4) "2000"
    5) "hao"
    6) "3000"
    127.0.0.1:6379> zrangebyscore salary -inf +inf   #正负无穷
    1) "lwh"
    2) "yun"
    3) "hao"
    
  • zconut

  • zcard 获取有序集合的个数

三种特殊数据类型

  • geospatial
  • hyperloglog
  • bitmaps

Geospatial

可以推算地理位置的信息,两地之间的距离,方圆几公里之内的人

需要注意:

  • 地球南北两极无法直接添加,
  • 一般会下载城市数据,直接通过Java程序一次性导入
  • 有效经纬度范围从-180到180,超出范围时会返回错误,
  • key由(纬度,经度,名称)构成

查看官网,一共有六个相关命令

image-20201121151049547

  • add、dist、hash、pos、radius、rediusbymember

  • geodist 返回两个给定位置之间的距离

  • geohash 返回geohash对位置进行的编码,用于内部调试,一般用不到

  • geopos 返回指定member的经纬度信息

  • georadius : 根据半径查找,需要给定中心点数据

  • georadiusbymember : 也是根据半径查找,但是中心点是已经存在的member

  • zrange 遍历member

  • zrem 移除member

  • 127.0.0.1:6379> geoadd key:city 116 99 beijing1
    (error) ERR invalid longitude,latitude pair 116.000000,99.000000
    127.0.0.1:6379> geoadd key:city 116.23128 40.220779 beijing
    (integer) 1
    127.0.0.1:6379> geoadd key:city 31.40527 121.48941 shanghai 
    (error) ERR invalid longitude,latitude pair 31.405270,121.489410
    127.0.0.1:6379> geoadd key:city  121.48941 31.40527 shanghai 
    (integer) 1
    
  • 纬度经度,member名称,geoadd可以一次添加多个

  • 可以使用geopos读取地理位置

  • geodist,输出两地距离,加上unit单位,设置输出距离单位

    • 127.0.0.1:6379> geodist key:city beijing shanghai
      "1088645.3557"
      127.0.0.1:6379> geodist key:city beijing shanghai km
      "1088.6454"
      127.0.0.1:6379> 
      
    • m、km、mi 英里、ft 英尺

  • 我附近的人功能,通过半径来查询,获取附近的人的定位地址

  • image-20201121154950406

  • georadius命令来实现,longitude纬度、latitude经度、radius半径 单位,输入查询位置的经纬度就能从key集合中找到在半径范围的元素

  • 127.0.0.1:6379> georadius key:city 110 30 500 km 
    (empty array)
    127.0.0.1:6379> georadius key:city 110 30 5000 km 
    1) "shanghai"
    2) "beijing"
    127.0.0.1:6379> georadius key:city 110 30 5000 km withcoord
    1) 1) "shanghai"
       2) 1) "121.48941010236740112"
          2) "31.40526993848380499"
    2) 1) "beijing"
       2) 1) "116.23128265142440796"
          2) "40.22077919326989814"
    127.0.0.1:6379> georadius key:city 110 30 5000 km withdist
    1) 1) "shanghai"
       2) "1109.3250"
    2) 1) "beijing"
       2) "1269.4847"
       127.0.0.1:6379> georadius key:city 110 30 5000 km withhash
    1) 1) "shanghai"
       2) (integer) 4054807796443227
    2) 1) "beijing"
       2) (integer) 4069896088584646
       127.0.0.1:6379> georadius key:city 110 30 5000 km withdist asc count 1
    1) 1) "shanghai"
       2) "1109.3250"
    127.0.0.1:6379> 
    
    • 后面跟了几个参数,withdist、withcoord、withhash、asc、desc、count
      • Withdist:返回元素位置的同时,把与中心之间相差的距离一同返回
      • withcoord : 将元素经纬度一同返回
      • withhash : 返回经过geohash编码的有序集合分值,主要用于底层调试,作用不大
      • asc : 根据中心的位置,从近到远的方式返回位置元素
      • desc:从远到近的方式返回元素
      • count :获取前n个匹配元素,对于提高效率是有效的

HyperLogLog

是一种概率数据结构,计数唯一事物,从技术上讲估计一个集合的基数,通常计数唯一项需要使用成比例的内存,因为需要记录使用过的元素,以免多次记录,但是hyperloglog的算法可以用内存换精度,虽然有误差,但是误差小于1%,算法的神奇之处在于只需要很小的内存,最大也不超过12k,类似集合的功能,能记录2^64的计数,从内存的角度来说,hyperloglog是首选

能用在网页的UV

  • 传统方式,set保存用户的id,用户可能是uuid,这样可能占用巨大的内存
  • 但是只是需要计数功能并不需要保存用户的id
7.0.0.1:6379> pfadd loglog2 6 7 8 9 0
(integer) 1
127.0.0.1:6379> pfcount loglog1 loglog2
(integer) 10
127.0.0.1:6379> pfmerge loglog1 loglog2
OK
127.0.0.1:6379> pfcount loglog1
(integer) 10
127.0.0.1:6379> 
  • pfadd
  • pfcount 计数
  • pfmarge 合并 //合并到第一个key

Bitmaps

统计用户信息,活跃与不活跃,登录未登录只有两种状态的数据,可以使用BitMaps

可以用作打卡功能实现,到达一定数目之后进行统计,判断预期数目与统计得出的数目是否达到预期

  • image-20201121185616297

  • setbit 中的offset是偏移量,可以看作下标,value只能是0或1

  • getbit

  • bitcount 统计key offset 为1的个数

  • bitpos 查看 key offset 为0或1的位置,并且可以设置range

    • 127.0.0.1:6379> bitpos bit1 1 0 -1
      (integer) 0 
      127.0.0.1:6379> getbit bit1 0
      (integer) 1
      #查询bit1 范围从0到-1,bit值为1的元素下标
      
      
  • bitop 对一个或多个保存二进制位的字符串key进行位元操作,将结果保存在deskkey上

    • and、or、not、xor

    • 除了not之外,其他都能加入多个key进行运算

    • 127.0.0.1:6379> setbit bit1 0 1 
      (integer) 0
      127.0.0.1:6379> setbit bit1 1 1
      (integer) 0
      127.0.0.1:6379> setbit bit2 0 1
      (integer) 0
      127.0.0.1:6379> setbit bit2 1 0
      (integer) 0
      127.0.0.1:6379> bitop and bit1 bit2
      (integer) 1
      127.0.0.1:6379> get bit1
      "\x80"
      127.0.0.1:6379> getbit bit1 0
      (integer) 1
      127.0.0.1:6379> getbit bit1 1
      (integer) 0
      127.0.0.1:6379> 
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值