redis数据结构及用法汇总

1. String

如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。

字符串长度大于39字节的时候,使用简单动态字符串,对象编码为RAW。小于等于39字节的时候使用embstr编码格式保存为字符串。

使用场景

Value除了是字符串以外还可以是数字。

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

用法:

set  k1  v1

get  k1

keys *   //查看所有key

strlen k1

exists k1  //查看是否存在

append k1 “asda”   //不存在就新建

incr  k1  //自增

decr k1  //自减

incrby  k1  10   //步长10增加

decrby  k1  10  //步长减少10

incr操作具有原子操作的特性,可以用来实现原子计数。


getrange k1  0 3 //截取字符串,闭区间[0,3]

getrange k1  0  -1 //查看整个字符串

setrange k1  1  xx  //替换指定位置开始的字符串,从下标1开始替换成xx

分布式锁中会使用

setex  k1 10  //设置k1  10s的过期时间

setnx  mykey  “ myvalue” //不存在再设置

ttl  k1  //查看k1剩余时间

批量设置和获取

mset  k1 v1  k2  v2  k3  v3

mget  k1  k2  k3  //批量获取key的值

msetnx k1 v1 k4 v4  //redis的事务不具有原子性但是操作具有原子性,msetnx要么全部成功要么全部回滚。

对象user : {id} : {filed} 

set user :1 {name : zhangsen, age : 3 , sex : f}

mset user : 1 : name  zhangsan  user : 1 : age 2

mget  user : 1 : name   user:1:age



getset  k1  20   //先获取k1的值,再设置成20,不存在返回nil

2. List

lists的底层实现是链表,头部和尾部插入速度极快,但定位会比较慢。

key不存在,创建新的链表。移除了所有的值,空链表也是不存在。

应用场景:

1. 我们可以利用lists来实现一个消息队列(Lpush Rpop)(重点,而且可以确保先后顺序,不必像MySQL需要通过ORDER BY来进行排序。

2. 利用LRANGE还可以很方便的实现分页的功能。

3. 在博客系统中,每片博文的评论也可以存入一个单独的list中。

4. 栈(Lpush  Lpop)

插入

lpush   list  one

lpush  list  two

lpush  list three  //左边插入,头插

lrange list  0 1  //返回[0,1]元素 这里返回的是three two

rpush  list  right  //右边插入,插入尾部

移除

lpop  list //左边移除

rpo  list   //右边移除

lrem list  0  three  //移除指定下标的值,这里是移除下标为0的three

修剪

ltrim  list  1  2  //截取指定下标范围的值,会改变list(原地操作)

获取值

lindex  list  1  //通过下标获取值

llen  list  //返回长度

不同list之间移动元素

rpoplpush  list   mylist  //移除list右边的第一个元素放到mylist左边第一个位置

更新值

lset  list  1  newvalue  //修改指定下标的值,前提是存在这个list

插入值

linsert  list before  one   zero  //在one之前插入zero

linsert  list  after  three  four  //在three之后插入four

3. Set

集合中元素不重复,无序。

当集合元素都是整数,且数量不超过512个,用整数集合实现。否则用Hash表实现。

应用场景:

QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。

sadd   myset  hello  //增加元素

smembers  myset  //查看集合成员

sismember  myset word //查看元素是否属于一个集合

获取元素个数

scard  myset   //获取元素个数

随机抽选

srandmember  myset  //随机抽选出指定个数的元素

srandmember  myset  2  //随机选出2个元素

删除

spop  myset  //随机删除

srem  myset  hello   //指定删除

两个集合元素移动

smove  myset  myset2  hello  //将myset中的hello移动到myset2

求差集

sdiff  myset  myset2

求交集

sinter  myset  myset2

求并集

sunion  myset  myset2

应用场景:

微博共同关注(并集)

4. Hash

hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。

当键值长度都小于64字节,且元素数量小于512个,使用压缩列表实现。否则用Hash实现。

Map集合, key-  这里的值是一个Map集合

单值设置

hset  myhash  name  zhangsan

hget  myhash  fileld1

多值设置

hmset myhash  name lisi  age  15   // 设置多个键值

hmget myhash name  age  //获取多个键值

hgetall myhash   //获取所有的键值

删除

hdel  myhash  name   //删除指定field

hlen  myhash   //获取field个数或者hash的长度

判断是否存在

hexists  myhash  field1  //判断某个字段是否存在

hkeys  myhash  //查看所有的field字段

hvals   myhash  //获取所有field字段对应的值

hincrby  muhash  field2  1 //对指定字段的值增加指定数值

hsetnx  myhash field 2  newvalue  //如果不存在就设置为newvalue 已存在则不能设置

应用:存储变动的信息,存储对象

hset  user : name  zhangsan  age  15  sex  female

5. Zset

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

字典+跳跃表实现:

字典:实现O(1)查找数据。跳跃表:实现有序操作。

set k1  v1

zset k1 score v1

zadd  salary  2500  zhangsan //添加一个值

zadd  salary  45000  xiaohong    800  xiaoming   //添加多个值

排序

zrangebyscore  salary   -inf   +inf 

zrangebyscore  salary  



zrange  salary  -inf  +inf  withscores  //按照score升序排列,范围在-inf到+inf

zrange  salary  0  5000  withscores  //按照score升序排列,范围在0到5000

zrevrangebyscore  salary  0  5000  withscores  //降序排列

删除

zrem salary zhangsan

获取有序集合元素的个数

zcard salary

统计两个区间的元素有多少个

zcount  salary

应用场景:

重要消息和普通消息

排行榜(播放量进行排序)

带权重判断

你可能感兴趣的:(Redis,redis)