Redit's 5 Data Structures

 Five data structures of redis

Redis common data structures and operations

 

Redis is an open source key-value database that supports string, list, set, zset (ordered set) and hash type data.

String

List

Set collection

Hash

Zset sorted set

  

String:

set/get/append/getset/setlen/del

incr/incrby/decr/decrby

setex/setnx/setrange/getrange

mget/mset/msetnx

 

Set data insert

set name zlh --Return value: ok, indicating that the insertion is successful. If there is a value for the current name, it will overwrite and replace the original value.

Get get data

get name --return value: "zlh" , if the current key has no value, return null

 

Append append data

append name is my friend --Return value: "zlh is my friend", if the value of the current key has a value, it will be appended to the original string, if not, it will be written.

 

 redis data deletion

del name

 

GetSet gets the original value while writing the new value

getset name zlh --Return value: "zlh is my friend", here returns the value of the original name, and at the same time sets the new value zlh for the value of name. At this time, the value of name is the real value of zlh

get name --return value: zlh, because the value set to name by getset above is zlh.

 

strlen gets string length

strlen name --Return value: 3, because the value of name is zlh, so the length is 3, if the key or value does not exist, it returns 0.

  

incr, incrby data addition calculation

incr is +1 built-in operation, incrby is +n self-set n operation

incr name   ---返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。

 

incr age   ----返回值:1,由于不存在age的key与value值,但是默认age为key值为0进行+1运算。

incr age   ---返回值:2,由于上一行代码给age赋值为1,这里incr命令进行+1运算,故返回值为2。

incrby age 10   ---返回值:12 ,因为原有age是2,这里+10故为12。

 

decr,decrby数据减法计算

decr为-1内置运算,decrby为减n自设n运算

decr name   --返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。

decr age  --返回自:11,因为原有age的value值为12,这里decr是自减1的意思,故为11。

decrby age 10   --返回值:1,因为原有age为11,这里-10,故为1。

  

setex 设置value值并设置过期时间(单位秒)

setex sex 20 male   ---返回值:ok,设置key为sex的value值为male,缓存的过期时间为20s。

ddl sex   ---返回值: 剩余过期时间,0为已过期,-1为永不过期。

get sex   ---返回值:male,说明此时为没有过期,当已经过期此处返回数据为null。

 

setnx 赋值判断原值是否存在,存在不赋值,返回0;不存在才赋值,返回1

setnx name Tom  ---返回值:0,因为name的原有value为zlh,存在值则不赋值。

get name  ---返回值:zlh,因为有值,故上面赋值为tom失败,返回0。

 

setnx phone 18501733702   ---返回值:1,赋值成功,因为原来不存在phone的key与value。

get phone   ---返回值:18501733702,说明上面的setnx赋值成功。

 

setrange 字符串替换赋值,从指定位置开始替换

setrange phone 9 123   --返回值:12,12为字符串长度,11位号码变成了12位。因为从第9位开始替换,替换到原有字符串的最后一位还没有替换完毕,所以在最后面添加啦一位设置为3。

get phone   ---返回值为:185017337123.

set phone  1    ---这里为了下面说下setrange的其他特性,把电话设置为1.

setrange phone 3 aaa   ---返回值为:6,因为原有phone的value值为1,不到三位,用0*00替换2位,所以要添加2为才能替换第三位后面的值为aaa。

get phone  ---返回值:1\*00\*00aaa。理解下上面的操作就知道这里为什么是这样的返回值了。

 

getrange 截取字符串,从下标为n开始截取到n或n+1,类似c#中的substring

set phone 18501733701 

getrange phone  1 5   ---返回值:85017,因为getrange是从下标为1开始截取截取到下标为5,这里包含下标为5的值。

getrange phone  0 0  ---返回值:1,从下标为0开始截取,截取到下标为0,包含下标为0。故返回值为1。

getrange phone 10 13   --返回值为:1,此号码下标直到10的11位号码,从10开始截取,截到第13位,后2位不存在忽略,只返回第10位。故返回干净的1。

 

批量操作修改及读取string数据

mget 批量读取,mset 批量赋值,msetnx 带事务性的赋值,发现有一个key已经存在,所有事务回归,不做赋值处理操作

mset name zlh age 30   ---返回值:ok,这里设置了 key为name和age的value分别为zlh,30

mget name zlh      ---返回值:1>zlh  2>30 

msetnx name Jim address China ---返回值为:0,没有做任何修改,因为key为那么已存在

mget name address   ---返回值:1>zlh  2>null

msetnx address China,hobbies sports  --返回值为:1,插入成功

mget address hobbies   ---返回值:1>China   2>sports

 

 

List 列表

1、redis中的list的基本属性?

List数据结构是链表结构,这意味这无论数据量多大,头尾操作数据还是很快的,list的容量是2的32次方减1个元素,即4294967295个元素数量。

 

2、为什么使用redis中的list数据类型?

依靠redis内存中操作数据的优势,又提供一些列实用独特的Api操控数据,用着简便,速度又快,又能实现特有的数据特征排序读写,做时间轴数据,评论列表,消息传递等等,又提供简便的分页,读写操作。你用不用。

 

3、为什么使用消息队列?

举个简单的例子,功能是这样子的,你要呈现页面给用户看,在你呈现页面之前有一个很复杂耗时的运算要操作,但是这个操作不影响页面呈现的数据,也不作为页面呈现的数据。 

方案一:运算完,呈现页面。

方案二:把要计算的数据,抛到持久化的消息队列中,不做耗时的运算,直接呈现页面。然后用另外一个程序来对消息队列中的数据单独做运算。 

 

显而易见,方案二是最佳答案,你用不用消息队列。

 

4、为什么不使用成熟的rabbitmq而使用redis实现的消息队列? 

Rabbitmq只关注数据的先进先出,没有数据优先级的概念,假如你想给那个数据来个先处理的特权,那么不好意思,我不支持,但是rabbitmq也可以变通着来处理,就是建立多个队列用程序路由来实现这个特权功能。那么redis实现的消息队列,是可以灵活掌控的,后面做示范。

  

Redis实现消息队列,并自带优先级功能

1、首先redis中的list是链表结构,具备消息队列中的先进先出特征。

2、从上面的几个高级命令中可以看出,list有几个自带阻塞功能,时间设置为0,可以视为永不休息的监听进程。

 

lpush/rpush/lpop/rpop

lrange/llen/lindex

  

lpush,rpush,linsert 数据插入命令:

 

rpush 向mylist列表中,从右边插入数据

rpush mylist 1   ---结果为:(integer) 1

rpush mylist 2   ---结果为:(integer) 2

rpush mylist 3   ---结果为:(integer) 3

 

lrange mylist 0 -1   ---lrange命令:查看mylist列表中的数据,0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。结果为:1> "1"  2> "2"  3> "3"

lpush mylist 0   ---lpush命令:向mylist列表中,从左边插入一条数据为0的数据

lrange mylist 0 -1   ---结果为:1>"0"  2>"1"  3>"2"  4>"3"

linsert mylist after 3 4   ---linsert命令,表达式为linsert key before|after pivot value ;这句命令的意思是在key为mylist的列表中查找值为3的数据,在其后插入一条值为4的数据。

lrange mylist 0 -1   ---结果为:1>"0"  2>"1"  3>"2"  4>"3"  5>"4"

linsert mylist before 0 -1   ---意思是:在key为mylist的列表中查找值为0的数据,在其前插入一条值为-1的数据。

lrange mylist 0 -1    ---结果为:1>"-1"  2>"0"  3>"1"  4>"2"  5>"3"  6>"4"

lisert mylist after 5 8    ---结果为:-1,由于mylist列表不存在值为5的数据,所以不执行任何操作,返回状态值-1。如果key不存在时,返回错误提示。

lrange mylist 0 -1   ---结果为:1>"-1"  2>"0"  3>"1"  4>"2"  5>"3"  6>"4"

  

删除数据:lpop,rpop

 

lpop mylist    ---lpop命令:从列表中的左边移除一条数据,同时输出被删除的数据,这里输出的结果为-1

lrange mylist 0 -1   ---结果为:1>"0"  2>"1"  3>"2"  4>"3"  5>"4"

 

rpop mylist   ---rpop命令:从列表的右边移除一条数据,同时输出被删除的数据,这里输出的结果为4

lrange mylist 0 -1   ---结果为:1>"0"  2>"1"  3>"2"  4>"3" 

ltrim mylist 1 3   ----ltrim命令:保留设定的两个下标区间的值,删除不在其区间的所有值。1为开始保留的下标值,3为结束保留的下标值。

lrange mylist 0 -1   ---结果为:1>"1"  2>"2"  3>"3" 

 

查看数据:lrange,llen,lindex

 

llen mylist   ---llen命令:返回列表的长度,这里mylist只剩下4条数据,故输出结果为4

lindex mylist 3   ---lindex命令:获取给定位置的数据,这里坐标为3的数据是"2",所以结果为2.

 

修改数据:lset

 

lset mylist 2 zlh   ---lset命令:把下标为2的值设置为zlh,如果下标值超出范围或对一个空list列表进行lset,那么将返回一个错误提示

lrange mylist 0 -1   ---结果为: 1>"1"  2>"2"  3>"zlh"

  

两个列表A,B,将A列表的尾元素添加到B列表的头元素中,命令:rpoplpush

 #这里我有连个列表A数据为{1,2,3} ,B列表数据为{4,5,6}

 rpoplpush A B

lrange A   ---结果为:1>"1' 2>"2"

lrange B   ---结果为:1>"3' 2>"4" 3>"5" 4>"6"

 

几个带阻塞的高级命令:blpop,brpop,brpoplpush

 

blpop A 30   ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长

blpop B30   ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长

brpoplpush A B 30   ---意思是:将A列表的尾元素添加到B列表的头元素中,如果A列表中有值则插入,如果没值,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长

 

 

Set

Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据。

 

sadd/smembers/sismember/srem/

scard/srandmember/spop/smove/sinter

 

操作单个set的命令

sadd 新增数据,key值相同下的value值不能重复,返回插入的数据个数,key后面可跟多个value值

 

sadd mySet 1   ---添加key为mySet的set数据值为1,

sadd mySet 2 4 5  ---添加key为mySet的set数据值为2,

 

smembers 查看set数据集合数据,可以获取全部的元素

smembers  mySet     ---获取key为mySet的说有set数据值集合

 

sismember 判断某个key的value中是否存在某个值 ,如果存在返回1,不存在返回0

 

sismember mySet 3  ---返回值为0,因为myset的set成员中只有1,2没有3

sismember mySet 2   ---返回值为1,因为myset的Set成员中存在2.

 

srem 删除数据,返回删除个数,key后面可跟多个value值

srem mySet 1   ---删除key为mySet,value为1的数据项。

srem mySet 2 4     ---删除key为mySet,value为2和4的2个数据项。

 

scard 查看set数据个数,如果不存在返回0

 

sadd mySet 1 2 3 4 5

scrad mySet   ---查看mySet中存在多少个数据项,返回结果为5

 

srandmember随机查看元素

srandmember mySet   ---输出key为mySet的数据项中的随机一个value,

 

spop 随机删除一个元素,并返回输出删除的数据

 

spop mySet    ----随机从key为mySet的数据集合中删除一条数据,并返回输出删除的数据

scard mySet    ---key为mySet的数据集合中的数据个数为4

  

操作多个set的命令

set除了对一个set中的元素进行增删改查外,还可以对多个set进行操作,比如将一个set的元素移到另外一个set中,计算多个set的并集,交集,差集等操作。

 

smove 将一个set中的元素移动到另外一个set中

sadd mySet 1 2 3    ----向mySet中添加3条数据 1 2 3

sadd youSet 3 4 5     ----向youSet中添加3条数据 3 4 5

smove youSet mySet 4  ---将youSet中的数据4移除的同时将数据4添加到mySet中

 

smembers mySet   ---结果为:1 2 3 4

smembers youSet   ---结果为 3 5

 

sinter 求交集

sinter mySet youSet   ---输出结果为mySet和youSet的交集,输出结果为:3

 

sunion求并集

sunion mySet youSet    ---输出结果为mySet与youSet的并集,输出结果为:1 2 3 4 5 

 

 

sdiff求差集

sdiff mySet youSet     ---输出结果为mySet中youSet不存在的数据,输出结果为:1 2 4

sdiff youSet mySet   ---输出结果为youSet中mySet不存在的数据,输出结果为:5

 

Hash:

数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引却没有实际意义,他只是一个位置而已。而我们在查找某个元素时,一般都会使用有意义的字段来做索引,这就产生啦dictionary。其实dictionary的实现,就是让key跟下标索引有一定的关系.

Hash数据类型

hash 是一个string类型的field和value的映射表,hash特别适合 存储对象

 

hset key field value 可以理解key为对象名 field为属性 value为属性值

hget key field 获取指定key的field的值

hmset key field1 value1 field2 value2 为指定的key设置多个field及其值

hmget key field1 field2 获取指定key的field1和field2的值

hkeys key 获取指定key的所有的field

hvals key 获取指定key的所有的field的值

hdel key field1 [field2] 删除指定key的一个或多个field

hexists key field 检查指定的key的field是否存在,如果存在返回1,如果不存在返回0

hgetall key 返回指定key的所有的field和field的value.

hlen key 返回指定key的field的个数

del key 

 

 

hset/hsetnx/hget/hdel

 

添加命令hset,如果key不存在,创建key,存在,则覆盖原有值

hset myhash name Jim  ----给key为myset的键值设置键为name值为Jim

 

查看命令hget

 

hget myhash name   ----输出: "Jim",获取key为myset,键为name的value

hset myhash name zlh   ----覆盖原有值,值改为zlh替换Jim 

hget myhash name   ---输出:"zlh"

 

获取key包含的field数量的命令hlen

 

hset myhash age 31 --- 设置key为myset键为age的value=31

hlen myhash   ---输出为2,key为myset的field数量为2

 

判断指定key中指定field是否存在的命令 hexists,存在返回1,不存在返回0

 

hexists myhash name   ---返回1,说明存在

hexists myhash name1  ---返回0,说明不存在

 

删除命令hdel,删除一个或多个指定的字段

 

hset myhash sex nan   ----添加数据

hset myhash issingle yes  ----添加数据

hset myhash hobby sports  ----添加数据

hdel myhash hobby  ----删除单个数据,filed为hobby的数据

hdel myhash issingle sex   ---删除多个数据,filed为issingle和sex的两条数据

 

如果key或field不存在插入有效,否则不采取操作的命令 hsetnx

hsetnx myhash sex nan   ---设置myhash,field为sex的value为nan,成功返回1,因为原来不存在sex这个字段

hsetnx myhash sex nv   ---设置myhash,field为sex的value为nv,不成功返回0,因为原来存在sex这个字段并且有值

hget myhash sex   --输出"nan"

 

操作增减的命令hincrby

del myhash  ---删除该键

hset myhash age 31  ---设置key为myhash的键为age值为31

hincrby myhash age 10   ---给key为myhash,键为age的值加10,输出结果为41

hincrby myhash age -10   ---给key为myhash,键为age的值减去10,输出结果为31

 

 

 

 

 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326010715&siteId=291194637