redis之四 常用命令和5种数据结构

版权声明:本文为博主原创文章,版权归博主所有。如转载,请注明出处! https://blog.csdn.net/javandroid/article/details/80858012

redis中文官网:string hash list set sortedset

一、基本操作

#获取所有的key
keys *

#判断一个键是否存在。存在则返回1,否则返回0
exists mykey

#删除键
del mykey

#过期时间(单位:秒)
#设置过期时间
expire mykey 10
#查看过期时间
ttl

#返回值的类型
type mykey

lpush bar 1
#获取类型。list
type bar

二、数据类型

redis有这几种数据类型:string,list,hash,set,sortedset
redis5.0又增加了新的数据类型:Streams,可参考官网:Introduction to Redis Streams

string类型

##字符串类型可以存储任何形式的字符串,包括二进制数据,用户邮箱,json化的对象。
set key hello
get key


当字符串是整数形式时,redis提供了一个incr命令,可实现自增。
#####整数加减操作######
##【incr 加1】
set key 10
#加1
incr key

##【incrby 增加指定的整数】
#加2
incrby key 2

##【incr 减1】
#减1
incr key

##【incrby 减小指定整数】
#减3
incrby key 3

######增加指定浮点数#######
##【incrbyfloat 增加指定浮点数】
incrbyfloat key 2.7
incrbyfloat key 5E+4

#【append 追加值(如何含空格,则需要加引号)】
append key " hello"

#【strlen 获取字符串长度】
strlen key

hash类型

假设有User对象以json序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性。如果在业务上只是更新age属性,其他的属性并不做更新,如果仍然采用string传输、处理时会造成资源浪费,而hash可以很好的解决这个问题。
这里写图片描述

##【hset】格式:hset [key 域1 值1]
hset user username zhangsan
hset user password 123456
hset user name 张三
hset user age 20

##【hsetnx 若key不存在则先创建,若已存在则返回0】nx是not exist的意思
#若不存在username=zhangsan则创建,若存在返回0
hsetnx user username "zhangsan" 

##【hget】格式:hget [key 域]
hget user username
hget user password 
hget user name 
hget user age 

##【hgetall 获取所有域的值】格式:hgetall [key]
hgetall user

##需要同时设置多个字段时,可以使用hmset命令。相应地可以使用hmget同时获取多个字段的值。
##【hmset 同时设置多个字段】格式:hmset[key 域1 值1 域2 值2]
hset user username zhangsan password 123456 name 张三 age 20

##【hmget】格式:hmget [key 域1 域2]
#只获取username和age域的值
hmget user username age

##【hexists 判断字段是否存在】
#判断username是否存在
hexists user username

##【hkeys 获取所有的域】
hkeys user

##【hvals 获取所有的值】
hvals user

##【hlen 获取字段数量】
hlen user

##【hincby 增/减某个值】
#age加2
hincby user age 2  
#age减2
hincby user age -2

##【hdel 删除域】
#删除username 
hdel user username

list类型

list类型是一个链表结构,主要功能是push,pop,获取一个范围的所有值等。操作中的key理解为链表的名字。

redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可通过push,pop操作从链表的头部或尾部添加/删除元素。这使得list既可以用作栈,也可以用作队列。

有意思的是list 的pop操作还有阻塞版本的,当我们[lr]pop一个list 对象时,如果list 是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的
例子如果我们用list 来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务到来时候工作线程可以立即返回,也可以避免轮询带来的延迟

l:left,头部   r:right,尾部
【lpush 头部添加】
lpush mylist "world"
lpush mylist "hello"

【rpush 尾部添加】
lpush mylist "hello"
lpush mylist "world"

【linsert 在特定位置之前或之后插入】
#在"hello"前插入"happy"(若有多"hello",则指第一个出现的位置)
linsert mylist before "hello" "happy"

【lset 设置/修改指定下标的元素值】
lset mylist 0 "hehe"
lset mylist -2 "这是双向链表哦" 

【lrem 删除count个value相同的值】count>0时,从头到尾的顺序删除,count<0时,从尾到头的顺序删除
#count>0时,从头到尾的顺序删除
lrem mylist 2 "hello"
#count<0时,从尾到头的顺序删除
lrem mylist -2 "hello"ltrim 裁剪元素】[格式:LTRIM key start stop]
#仅保留0-2下标元素
ltrim mylist 0 2 

【lpop 从头部删除元素,并返回删除元素】
lpop mylist 

【rpop 从尾部删除元素,并返回删除元素】
rpop mylist

【rpoplpush 从前者尾部移除元素,并添加到后者的头部,返回被移除的元素值。整个操作是原子的】
rpoplpush mylist mylist2

【lindex 返回指定index位置的元素】
lindex mylist 0

【llen 返回list的长度】
llen mylist

set类型

##【sadd 添加元素】
#添加
sadd myset "one"
sadd myset "two"
sadd myset "two" //覆盖

##【smembers 查看所有元素】
smembers myset

##【srem 删除元素(remove)】
srem myset "two"  #[可以不加引号]

##【spop 随机弹出元素,会删除 [srandmember返回随机元素不删除]】
spop myset

##【sdiff 求差集】A-B:剔除A中的属于A和B的共有元素
sdiff myset myset2
##【sdiffstore 求差集,并另存储】
#求差集,并保存到myset10中
sdiffstore myset10 myset myset2

##【sinter 求交集】
sinter myset myset2
##【sinterstore 求交集,并另存储】
sinter myset10 myset myset2

##【sunion 求并集】
sunion myset myset2
##【sunionstore 求并集,并另存储】
sunion myset10 myset myset2

##【smove 移动元素从一个集合到另一个集合】
#将myset中的one元素移到myset2中
smove myset myset2 one 

##【scard 返回元素个数】
scard myset

##【sismember 判断某元素是否在集合中】
sismember myset two

##【srandmember 返回随机元素,不删除[spop返回随机元素会删除]】

sortedset类型

##【zadd 添加元素】score用于排序
#成绩表
zadd myzset 56 "zhangsan"
zadd myzset 88 "lisi"
zadd myzset 77 "wangwu"
zadd myzset 100 "wangwu" //会覆盖

##【zcard 返回元素的个数】
zcard myzset

##【zscore 返回元素的score】
zscore myzset zhangsan

##【zrem 删除元素】
zrem myzset zhangsan

##【zrange 返回所有元素,按score从小到大】
#
zrange myzset 0 -1            //不带score
zrange myzset 0 -1 withscores //带score
##【zrevrange 返回所有元素,按score从大到小】
zrevrange myzset 0 -1
zrevrange myzset 0 -1 withscores


##【zincrby 增加score值】若不存该元素,则先添加元素再增加score值
zincrby myzset 2 lisi

##【zrank 返回某个元素的排名】返回的是[下标],而不是score
zrank myzset lisi
##【zrevrank 返回某个元素的排名,按score从大到小的顺序】返回的是下标,而不是score


##【zrangebyscore 返回score在给定区间的[元素]】
#返回score在60-90区间的元素
zrangebyscore myzset 60 90  withscores

##【zcount 返回score在给定区间的[元素的数量]】
zcount myzset 

##【zremrangebyrank 删除排名在给定区间的元素】
#按从小到大顺序,删除下标为1的元素
zremrangebyrank myzset 1 1  //删除下标为1的元素
zremrangebyrank myzset 1 1  //删除下标为1-2区间的元素

##【zremrangebyscore 删除score在给定区间的元素】
#按从小到大顺序,删除score在50-60区间的元素
zremrangebyscore myzset 50 60 

猜你喜欢

转载自blog.csdn.net/javandroid/article/details/80858012