redis(一) -基本命令

一、Redis特性

1、速度快、持久化、多种数据结构、支持多种开发语言、功能丰富、简单、主从复制、高可用,分布式

2、数据结构:String、Hash、List、Set、Zset、BitMap、HyperLogLog、GEO

3、单线程 + 多路 IO 复用

二、数据类型

String

实际分配的空间 caoacity 一般要高于实际字符串的长度。当字符串长度小于1M时,扩容是加倍现有空间的;当超过1M时,扩容一次只会多扩容1M的空间;字符串最大传递为512M

1、赋值

set key “value”

2、取值

get key

3、同时赋多个值

mset key1 value1 [key2 value2…]

4、获取多个值

mget key1 [key2…]

5、先返回旧值再赋新值

getset key value

6、设置key同时设置过期时间

setex key 过期时间 value

7、 key 不存在时才赋值

setnx key value

8、所有 key 不存在时才赋值

msetnx key1 value1 [key2 value2…]

9、截取范围的值(索引从0开始,包含start/stop)

getrange key [start stop]

10、用value替换从start起对应位置的值(索引从0开始,包含start)

setrange key start value
示例:
1、set name mynameluck
2、setrange name 2 abc
3、get name
结果:myabceluck

11、自增 1(key 的 value 值必须为数值)

incr key

12、自减 1(key 的 value 值必须为数值)

decr key

13、自增指定数值(key 的 value 值必须为数值)

incrby key 步长

14、自减指定数值(key 的 value 值必须为数值)

decrby key 步长

15、在key的值后面追加value

append key value

16、获取值的长度

strlen key

17、编码方式1

int:8 个字节的长整型

18、编码方式2

embstr:大于 8 个字节且小于等于 39 个字节的字符串

19、编码方式3

raw: 大于 39 个字节的字符串

20、字符串最大存储

512M

Hash

  • hash对应两种数据结构:ziplist、hashtable,当field-value 长度较短时使用ziplist,否则使用 hashtable

1、单个赋值

hset key field value

  • 例:hset aa field1 3

2、 单个取值

hget key field

  • 例:hget aa field1—>结果:3

3、 多个赋值

hmset key field1 value [field2 value…]

  • 例:hmset bb fielda 1 fieldb 2

4、多个取值

hmget key field1 field2

  • 例:hmget bb fielda fieldb
  • 结果:1 2

5、查看 key 中的 field 是否存在

hexists key field

6、获取集合中的所有 field

hkeys key

7、获取集合中的所有 value

hvals key

8、为key中的field 的value 增加 数值,类似于String 中的 incrby

hincrby key field increment

  • 例:hincrby test age 2

9、当field不存在时,为该field赋值

hsetnx key field value

10、获取指定key的所有field和value

hgetall key

11、编码方式1

ziplist(压缩列表):当哈希类型中元素个数小于 hash-max-ziplist-entries 配置(默认 512个),同时所有字节都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现

12、 编码方式2

hashtable(哈希表):当上述条件不满足时,Redis 则会采用 hashtable 作为哈希的内部实现

List

  • List 在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。当数据量比较多时才会改为quicklist

  • 以为普通链需要附加指针(prev、next)空间太大,比较浪费空间

  • redis将普通链表和ziplist结合起来组成了quicklist,也就是将多个ziplist使用双向指针串起来,这样既满足了快速插入性能,又不会出现太大的空间浪费

1、在list头部添加元素

lpush “key” value [value…]

  • 例:lpush list_key 1 2 3

2. 在list尾部添加元素

rpush “key” value [value…]

  • 例:rpush list_key a b c

3、从左边移除元素并返回该元素

lpop key

4、从右边移除元素并返回该元素

rpop key

5、从第一个key1中弹出最右的元素并将该元素加入到第二个key2的头部

rpoplpush key1 key2

6、按照索引获取list元素

start与stop分別为起始位置以及结束位置;start=0 、stop =-1 时表示获取所有

lrange key1 start stop

  • 例:lrange list_key 0 10
  • 结果:3 2 1 a b c

7、按照索引获得元素(从左到右)

lindex key index

8、获取列表长度

llen key

9、从左到右删除n个值为value的元素

lrem key n value

10、在value的前面(后面)插入新元素

linsert key before/after value newvalue

11、将key中索引为index的元素替换为value

lset key index value

12、编码方式1

ziplist(压缩列表):当列表中元素个数小于 512(默认)个,并且列表中每个元素的值都小于 64(默认)个字节时,Redis 会选择用 ziplist 来作为列表的内部实现以减少内存的使用。当然上述默认值也可以通过相关参数修改:list-max-ziplist-entried(元素个数)、list-max-ziplist-value(元素值)

13、编码方式2

linkedlist(链表):当列表类型无法满足 ziplist 条件时,Redis 会选择用 linkedlist 作为列表的内部实现

Set(value唯一)

  • set是String类型的无序集合,它的底层是一个value为null的hash表,所以添加、删除、查找复杂度都是O(1)

  • set 的数据结构是字典,字典是由哈希表实现的

1、赋值

sadd key value1 [value2]

  • 例:1:sadd test1 a
  • 例:2:sadd test2 b c

2、 取出所有值

smembers key

  • 例:smembers test2
  • 结果:“a” “b” “c”

3、判断key中是否存在该value

sismember key value

4、返回集合中元素个数

scard key

5、删除集合中某个元素

srem key value1 [value2…]

6、随机从集合中取出一个值,且该值被删除

spop key

7、随机从集合中取出n个值,不会从集合中删除

srandmember key n

8、把集合中一个值从一个集合移动到另一个集合,source中的值移除

smove source destination value

9、返回两个集合的交集

sinter key key2

10、返回key1、key2两个集合的交集,并存入新集合destination

sinterstore destination key1 key2

11、返回key1、key2两个集合的并集

sunion key1 key2

12、返回key1、key2两个集合的并集,并存入新集合destination

sunionstore destination key1 key2

13、返回key1、key2两个集合的差集(key1中不包含在key2中的元素)

sdiff key1 key2

14、返回key1、key2两个集合的差集(key1中不包含在key2中的元素),并存入新集合destination

sdiffstore destination key1 key2

15、编码方式1

intset(整数集合):当集合中的元素都是整数,并且集合中的元素个数小于 512 个时,Redis 会选用 intset 作为底层内部实现

16.、编码方式2

hashtable(哈希表):当上述条件不满足时,Redis 会采用 hashtable 作为底层实现

Zset(value唯一)

zset底层使用了两种数据结构:

  • hash:hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过value找到相应的score值。类似于hashmap,hashmap中由field与value;zset 中的member存放在field,保证唯一性,score存放在value中

  • 跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表

1、赋值

score为对value進行排序的权重

zadd key score member[score member]

  • 例:zadd rr 1 a 2 b 0 c 5 e 4 f

2、返回有序集合 key 中,索引在start -stop 之间的元素

zrange key start stop -----> 只返回member
zrange key start stop withscores -----> member 和 score 一起返回

3、返回有序集合 key中,所有score介于min 与max之间的(包括min与max)的成员,并按score由小到大排序

zrangebyscore key min max [withscore] [limit offset count]

  • 例1:zrangebyscore rr 0 100 结果:“c” “a” “b” “f” “e”
  • 例2:zrange rr 0 100 结果:“c” “a” “b” “f” “e”

4、返回有序集合 key中,所有score介于max与min之间的(包括max与min)的成员,并按score由大到小排序

zrevrangescore key max min [withscore] [limit offset count]

5、为元素的score加上增量

zincrby key increment menber

6、删除集合中的元素

zrem key member

7、统计集合,分数区间内的元素个数

zcount key min max

8、获取key中的成员数

zcard key

8、返回该值在集合中的排名,从0开始

zrank key member

9、编码方式1:

ziplist(压缩列表):当有序集合的元素个数小于 128 个(默认设置),同时每个元素的值都小于 64 字节(默认设置),Redis 会采用 ziplist 作为有序集合的内部实现

10.、 编码方式2

skiplist(跳跃表):当上述条件不满足时,Redis 会采用 skiplist 作为内部编码

Bitmaps

  • bitmaps本身不是一种数据类型,实际上他就是字符串(key-value),但是它可以对字符串的位进行操作

  • bitmaps其实有点类似于数组,不过bitmaps中只能存储 0 和 1 ,偏移量作为索引

      setbit bitmapstest 1 0 
      setbit bitmapstest 2 1 
      setbit bitmapstest 3 1 
      setbit bitmapstest 4 0 
      setbit bitmapstest 5 0
    

如下所示:可以把value作为数组中的元素,offset作为数组的索引
在这里插入图片描述

1、赋值(返回0表示没有该key-offset-value,赋值成功,1表示已存在该值,赋值失败 )

setbit key offset value

  • 例:setbit mybit:20211110 5 1

2、取值

getbit key offset

  • 例:getbit mybit:20211110 5

3、获取该key所有value为1的总数

bitcount key [start] [end]

  • 例:bitcount mybit:20211110 0 5

4、统计字符串从 start 字节到 end 字节值为1的数量,-1表示最后一个 位,-2表示倒数第二个 位

bitcount key [start end]

5、多个key的交集(and)、并集(or)、非(not)、异或(xor)操作并将结果保存在destkey中

bitop and/or/not/xor destkey key [key…]

  • 例:bitop and newkey user1 user2

HyperLogLog

  • HyperLogLog的优点是在输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且是很小的

  • 在HyperLogLog中,每个键只需要12KB内存,就可以计算接近2^64个不同元素的基数,而不会存储输入元素本身;所以HyperLogLog不能向集合那样返回输入的各个元素

  • 基数:比如数据集{1,3,5,7,5,7,8},那么这个数据集的技术为{1,3,5,7,8},基数(不重复数)为5。基数估计就是在误差可接受范围内,快速计算基数

  • HyperLogLog 不能存在重复值

1、赋值

pfadd key element[element…]

  • 例1:pfadd test1 a b c
  • 例2:pfadd test2 q w e r

2、取指定key中的元素个数总和

pfcount key [key…]

  • 例1:pfcount test1 结果: 3
  • 例2:pfcount test2 结果: 4

3、合并key 到newkey(也可以是已存在的key)中

pfmerge destkey sourcekey [sourcekey…]

  • 例1:pfmerge test1 test2
  • 例2:pfcount test1 结果: 7
  • 例3:pfcount test2 结果: 4

GEO

  • 提供经纬度设置,查询,范围查询,距离查询,经纬度hash等操作

1、赋值(两极不能添加,已存在的数据不能再添加)

geoadd key longitude latitude member [longitude latitude member …]

  • longitude:经度 ,有效范围:-180 到180 度
  • latitude:纬度 ,有效范围:-85.05112878 到 85.05112878
  • member:地理位置
  • 例1:geoadd test1 10.000002086162567 14.999999491308223 shenzhen
  • 例2:geoadd test2 10.999999344348907 24.999999152180358 guangzhou

2、取值

geopos key member [member …]

  • 例:geopos test1 shenzhen 结果:“10.000002086162567” “14.999999491308223”

3、获取两地间的直线距离

m:米
km:千米
mi:英里
ft:英尺

geodist key member1 member2 [m|km|ft|mi]

  • 例:geoadd geotest 10.000002086162567 14.999999491308223 shenzhen 10.999999344348907 24.999999152180358 guangzhou
  • 例:geodist geotest shenzhen guangzhou km
  • 结果:“1117.1455”

4、范围

根据给定的经纬度为中心获取key的地理位置在某一半径内的元素

georadius key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

例1:

GEORADIUS geotest 10 15 15 km WITHCOORD
结果:
1) 1) "test1"
   2) 1) "10.000002086162567"
      2) "14.999999491308223"
2) 1) "test2"
   2) 1) "10.000002086162567"
      2) "14.999999491308223"

例2:

GEORADIUS geotest 10 15 15 m WITHDIST
结果:
1) 1) "test1"
   2) "0.2312"
2) 1) "test2"
   2) "0.2312"

例3:

GEORADIUS geotest 10 15 15 km asc
结果:
1) "test2"
2) "test1"

例3:

GEORADIUS geotest 10 15 15 km  WITHDIST count 1
获取以经度10,纬度15为中心,15km为半径,获取 geotest 在此半径内的元素
结果:
1) 1) "test2"
   2) "0.0002"
  • WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
  • WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
  • ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
  • WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。 COUNT
  • COUNT:传入COUNT参数,可以返回指定数量的结果。

5、 范围

根据给定地理位置获取指定范围内的地理位置集合,与georadius类似

GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD]
[WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

6、Hash

获取某个地理位置的geohash值

geohash key member [member …]

  • 例:geohash geotest shenzhen

三 、其他命令

  • 查看当前库中所有 key : key *
  • 判断某个 key 是否存在 :exists key
  • 查看 key 的类型 :type key
  • 删除 key :del key
  • 获取key过期时间:ttl key
  • 异步删除 key :unlink key
  • 设置 key 过期时间 :expire key 10(过期时间10s)
  • 查看剩余过期时间 :ttl key(-1表示 永不过期,-2表示已过期)
  • 选择数据库 :select 1(选择数据库1)
  • 查看当前数据 key 的数量 :dbsize
  • 清空当前数据库 :flushdb
  • 清空所有数据库 :flushall
  • 发布消息:publish key value
  • 订阅消息:subscribe key
  • 设置值和过期时间:set key value nx ex time
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值