Redis学习(中)

Redis学习(中)

Redis的数据结构

  • 字符串(String)(常用)
  • 字符串列表(list)
  • 有序字符串集合(sorted set)
  • 哈希(hash)(常用)
  • 字符串集合(set)

Redis是一个key-value的数据库,key定义时候要注意不要过长,最好不要超过1024字节,不仅消耗内存,而且还会降低查找效率;也不要太短,会降低key的可读性;最好有统一命名规范。

String

字符串是redis中最基础的数据结构,在redis中以二进制进行操作的,存入和获取的数据相同;value允许字符串最大长度是512M。

常用命令
  1. 赋值
1
set [key] [value]

设置一个key以及其对应的值,例如设置一个name为myjdemo的数据命令如下:

1
set name myjdemo
  1. 取值
1
get [key]

获取一个key对应的值,例如获取name对应的值的命令如下:

1
get name
  1. 取值后设置
1
getset [key] [value]

获取一个key对应的值并给其修改成新的value值,例如我们将name对应的值取出来之后改成myj的命令如下:

1
getset name myj

该命令会返回myjdemo,再次使用get name取name的值时,就会返回myj

  1. 删除一个键
1
del [key]

例如删除name这个键的命令如下:

1
del name

该命令会返回ok,当再次使用get name取name的值时,就会返回nil,表示为空。

  1. 数值递增
1
incr [key]

将key对应的值加一。当数据库中没有该key时,会新建这个key并设置为0,然后incr之后变为1;当数据库中存在该key但他的value是字符串或者其他不可以加一的数据类型时,会报错。例如:

1
incr num

我们数据库中没有num这个key,所以他会新建一个key,对应的value初始值为0,incr后变为1,因此返回1。

还有一个命令incrby,可以将key对应的值加上指定数字。

1
incrby [key] [number]

如果把num在原来基础上3,命令如下:

1
incrby num 3
  1. 数值递减
1
decr [key]

同理,当数据库中没有该key时,会新建这个key并设置为0,然后decr之后变为-1;当数据库中存在该key但他的value是字符串或者其他不可以减一的数据类型时,会报错。也有一个对应的decrby命令,用法一致,不再赘述。

  1. 拼凑字符串
1
append [key] [str]

该命令会在key对应的value后面追加str的字符串,并且返回的时字符串的长度,例如,在num后面追加一个5,命令如下:

1
append num 5

此时返回的时2,是指num的长度为2,num当前为45。如果key原来不存在,会自动创建一个空的字符串。

Hash

Hash是一个String Key和String Value的map容器,每一个Hash可以存储4294967295个键值对。

常用命令
  1. 赋值
1
2
hset [key] [field1] [value1]
hmset [key] [field1] [value1] [field2] [value2] ...

其中key为hash的名称,field为键,value为值,hset命令设置一个field value对,hmset可以设置多个,但是必须成对出现。

  1. 取值
1
2
3
hget [key] [field1]
hmget [key] [field1] [field2] ...
hgetall [key]

相比起赋值,取值多了一个hgetall命令,即一次将该hash中所有键值对全部取出来。

  1. 删除
1
2
hdel [key] [field]
del [key]

hdel删除指定hash中的指定键值对,del命令删除整个hash

  1. 递增/递减
1
hincrby [key] [field] [number]

与之前例子原则相同,不再赘述。

  1. 扩展命令
1
2
3
4
hexists [key] [field]
hlen [key]
hkeys [key]
hvalues [key]

hexists用于判断一个hash中是否有某个field,hlen用于获得该hash中所有键值对的数量,hkeys用户获取该hash所有键值对的键,hvalues用于获取该hash中所有的值。

list

在redis中,list是按照插入顺序排序的字符串链表。在插入的键不存在时,会自动创建一个新的链表;链表中的所有元素都被移除时,这个键对应的链表也会移除。如果在链表的两端插入或者删除元素,是非常高效的;如果元素的插入或删除在链表的中间,效率较低。

常用命令
  1. 两端添加
1
2
lpush [key] [value1] [value2] ...
rpush [key] [value1] [value2] ...

lpush是从左侧向list中添加元素,例如lpush testlist a b c命令执行后,链表中的元素为cba;rpush即从右侧向链表中添加元素

  1. 查看链表
1
lrange [key] [start] [end]

查询key对应的list中第start位到第end位的元素,其中start和end的数值可以为负数,表示倒数第n个元素。例如lrange testlist 0 -1表示查询第0位到倒数第一位的元素,即查询出testlist中所有的元素。

  1. 两端弹出
1
2
lpop [key]
rpop [key]

lpop命令从list中弹出左边第一个元素,弹出时,原list中就没有该元素了;同理rpop即弹出list中右边第一个元素。

  1. 获取列表元素个数
1
llen [key]
  1. 扩展命令
1
2
3
4
5
6
lpushx [key] [value]  #当[key]对应的list存在时在左边插入value,否则不插入
rpushx [key] [value] #当[key]对应的list存在时在右边插入value,否则不插入
lrem [key] [count] [value] #从[key]对应的list中删除count个value。当count为0时删除所有value,当count大于0时从头开始删除count个value,当count小于0时从后向前删除count的绝对值个value。
lset [key] [index] [value] #将[key]对应的list中下标为index的地方改为value
linsert [key] [before/after] [srcvalue] [value] #在[key]对应的list中,将srcvalue的前/后插入value元素
rpoplpush [key1] [key2] ##将[key1]对应的list中右边第一个元素弹出并添加到[key2]所对应的list的左边
set

set是没有排序的字符集合,set集合不允许出现重复的元素。

常用命令
  1. 添加、删除元素
1
2
sadd [key] [value1] [value2] ...
srem [key] [value1] [value2] ...

sadd在[key]对应的set中添加一些元素;srem在[key]对应的set中删除一些元素。

  1. 获得集合中的元素
1
2
smenbers [key]
sismenber [key] [value] #判断value是否在set中
  1. 集合中的差集运算
1
sdiff [key1] [key2]
  1. 集合中的交集运算
1
sinter [key1] [key2]
  1. 集合中的并集运算
1
sunion [key1] [key2]
  1. 扩展命令
1
2
3
4
5
scard [key] #得到set的元素个数
srandmember [key] #得到set中随机一个元素
sdiffstore [key] [key1] [key2] #将key1和key2差集存入到key的set中
sinterstore [key] [key1] [key2] #将key1和key2交集存入到key的set中
sunionstore [key] [key1] [key2] #将key1和key2并集存入到key的set中
sorted-set

相对于set,它是有序的,每一个元素都有一个分数与之关联,按照分数从小到大排序,分数可以重复但元素不可重复。

常用命令
  1. 添加元素
1
zadd [key] [score1] [value1] [score2] [value2] ...

如果插入的value已存在,会更新其分数。

  1. 获得元素
1
2
zscore [key] [value] #获得value的分数
zcard [key] #获得set的元素个数
  1. 删除元素
1
zrem [key] [value1] [value2]...
  1. 范围操作
1
2
3
4
5
zrange [key] [start] [end]
zrange [key] [start] [end] withscores #会带着分数显示元素
zrevrange [key] [start] [end] #从大到小取出元素
zremrangebyrank [key] [start] [end] #按元素下标范围删除元素
zremrangebyscore [key] [startscore] [endscore] #按元素分数范围删除元素
  1. 扩展命令
1
2
3
zrangebyscore [key] [startscore] [endscore] withscores #按元素分数范围获取元素
zincrby [key] [number] [value] #给value加number分
zcount [key] [startscore] [endscore] #统计分数范围内元素的个数
# Java, Redis
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×