Redis命令行操作整理

Redis

 

String操作:

string 是最简单的类型,你可以理解成与Memcached 是一模一样的类型,一个key 对应一个value,其上支持的操作与Memcached 的操作类似。但它的功能更丰富。

string 类型是二进制安全的。意思是redis 的string 可以包含任何数据,比如jpg 图片或者序列化的对象。从内部实现来看其实string 可以看作byte 数组,最大上限是1G 字节,下面是string 类型的定义:

struct sdshdr {

long len;

long free;

char buf[];

};

len 是buf 数组的长度。

free 是数组中剩余可用字节数,由此可以理解为什么string 类型是二进制安全的了,因为它本质上就是个byte 数组,当然可以包含任何数据了buf 是个char 数组用于存贮实际的字符串内容,其实char 和c#中的byte 是等价的,都是一

个字节。

另外string 类型可以被部分命令按int 处理.比如incr 等命令,如果只用string 类型,redis 就可以被看作加上持久化特性的memcached。当然redis 对string 类型的操作比memcached 还是多很多的,

具体操作方法如下:

Get key

Set key value

Del key key

Exists key 验证键是否存在

setnx key value
设置key 对应的值为string 类型的value。如果key 已经存在,返回0,nx 是not exist 的意思。

setex key 10 value
设置key 对应的值为string 类型的value,并指定此键值对应的有效期。

setrange key 3 value
设置指定key 的value 值的子字符串。

mset key value key1 value1
一次设置多个key 的值,成功返回ok 表示所有的值都设置了,失败返回0 表示没有任何值被设置。

msetnx key1 value1 key2 value2
一次设置多个key 的值,成功返回ok 表示所有的值都设置了,失败返回0 表示没有任何值被设置,但是不会覆盖已经存在的key。

getset key value1
设置key 的值,并返回key 的旧值。key不存在 则返回nil

getrange key 0 3
获取指定key 的value 值的子字符串。包含开始和结束为止字符,如果为负数 则从右至左开始

mget key1 key2 key3

incr key

对key 的值做加加操作,并返回新的值。注意incr 一个不是int 的value 会返回错误,incr 一个不存在的key,则设置key 为1

incrby key 3
指定步长,步长可为负,key 不存在时候会设置key,并认为原来的value 是 0,

decr decrby

append key appendString

给指定key 的字符串值追加appendString,返回新字符串值的长度。

strlen key
取指定key 的value 值的长度。



hashes 类型操作

Redis hash 是一个string 类型的field和value的映射表.它的添加、删除操作都是 O(1() 平均)。hash 特别适合用于存储对象。相较于将对象的每个字段存成单个string 类型。将一个对象存储在hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash 对象时开始是用zipmap(又称为small hash)来存储的。这个zipmap 其实并不是hash table,但是zipmap 相比正常的hash 实现可以节省不少hash 本身需要的一些元数据
存储开销。尽管zipmap 的添加,删除,查找都是O(n),但是由于一般对象的field 数量都不太多。所以使用zipmap 也是很快的,也就是说添加删除平均还是O(1)。如果field 或者value的大小超出一定限制后,Redis 会在内部自动将zipmap 替换成正常的hash 实现. 这个限制可以在配置文件中指定

hash-max-zipmap-entries 64 #配置字段最多64 个
hash-max-zipmap-value 512 #配置value 最大为512 字节

hset myhash field value
设置hash field 为指定值,如果key 不存在,则先创建。

hsetnx 
设置hash field 为指定值,如果key 不存在,则先创建。如果field 已经存在,返回0

hmset myhash field1 value1 field2 value2
同时设置hash 的多个field。

hget myhash field1

hmget myhash field1 field2 field3

hset myhash field 10

指定的hash filed 加上给定值

hexists myhash field1
测试指定field 是否存在。

hlen myhash
返回指定hash 的field 数量。

hdel myhash field1

hkeys myhash

返回hash 的所有field。

hvals

hgetall


lists 类型操作



Redis 的list 类型其实就是一个每个子元素都是string 类型的双向链表。链表的最大长度是(2的32 次方)。我们可以通过push,pop 操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。

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


lpush mylist value
list 的头部添加字符串元素

rpush mylist value
尾部

linsert mylist before value insertValue
value之前或之后添加字符串元素

lset mylist -1 setValue
设置list 中指定下标的元素值(下标从0 开始,最右边下标为-1)

lrem mylist 2 value
删除count 个和value 相同的元素。count>0从头到尾的顺序删除,count<0从尾到头,count=0删除全部

ltrim mylist 1 -1
保留指定key 的值范围内的数据

lpop mylist
从list 的头部删除元素,并返回删除元素

rpop mylist
尾部

rpoplpush mylist1 mylist2
从mylist1 的尾部移除元素并添加到mylist2 的头部,最后返回被移除的元素值,整个操作是原子的.如果mylist1 是空或者不存在返回nil

lindex mylist 0

返回list 中index 位置的元素value

llen mylist
长度

lrange mylist 0 -1
返回对应位置的value


sets 类型操作


Redis 的set 是string 类型的无序集合。set 元素最大可以包含(2 的32 次方)个元素。

set 的是通过hash table 实现的,所以添加、删除和查找的复杂度都是O(1)。hash table 会随着添加或者删除自动的调整大小。需要注意的是调整hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在sortedset 中使用了。关于set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)通过这些操作可以很容易的实现sns中的好友推荐和blog 的tag 功能。


sadd myset value
添加元素

srem myset value
删除

smembers myset
全部元素值

spop myset
随机返回并删除一个元素

sdiff myset1 myset2
求差集 myset1为基准

sdiffstore myset3 myset1 myset2
将1 与2 的差集保存到3

sinter sinterstore 交集

sunion sunionstore 并集

smove myset1 myset2 three

将three从1中移动到2

scard myset
set中元素数量

sismember myset value
测试value是否是set的元素

srandmember myset
随机返回set 的一个元素,但是不删除


sorted sets 类型操作


sorted set 是set 的一个升级版本,它在set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有两列的mysql 表,一列存value,一列存顺序。操作中key 理解为zset 的名字。

和set 一样sorted set 也是string 类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set 的实现是skip list 和hash table 的混合体。

当元素被添加到集合中时,一个元素到score 的映射被添加到hash table 中,所以给定一个元素获取score 的开销是O(1),另一个score 到元素的映射被添加到skip list,并按照score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list 的
开销一致,redis 的skip list 实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set 最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为score 存储,对象的id当元素存储。


zadd myzset score member //zadd myzset 1 "one"
添加元素member,score 用于排序。如果该元素已经存在,则根据score 更新该元素的顺序

zrange myzset 0 -1 withscores
按照score来查看元素(从小到大) 0 -1 代表下标  非score

zrevrange
从大到小

zrem myzset value
删除

zincrby myzset 2 "one"
如果在名称为key 的zset 中已经存在元素member,则该元素的score 增加increment;否则向集合中添加该元素,其score 的值为increment

zrank myzset two
返回元素的排名(按score 从小到大排序)即下标,非score

zrevrank myzset two
(按score 从大到小排序)

zrangebyscore myzset 2 3 withscores
返回集合中score 在给定区间的元素  2 3 代表score 非 下标

zcount myzset 2 3
返回集合中score 在给定区间的数量

zcard myzset
返回集合中元素个数

zscore myzset two
返回元素的score

zremrangebyrank myzset 3 3
删除集合中排名在给定区间的元素 3 3 代表index即下标 非score

zremrangebyscore myzset 1 2
删除集合中score 在给定区间的元素  非index下标



Redis 常用命令


keys * //keys mylist*

返回满足给定pattern 的所有key

exists key
确认一个key 是否存在

del key

删除一个key

expire key 10
设置一个key 的过期时间(单位:秒)

persist key

移除给定key 的过期时间

ttl key
获取这个key 的有效时长,直至为-1 说明此值已过期

select 0
选择数据库  数据库编号从0~15

move key 1
将当前数据库中的key 转移到其它数据库中

randomkey
随机返回当前数据库中的一个key

rename key key1
重命名key

type key
返回值的类型


ping
测试连接是否存活 返回PONG表示成功

echo string

quit
退出连接。

dbsize
返回当前数据库中key 的数目。

info
获取服务器的信息和统计

config get *
获取服务器配置信息。

flushdb
删除当前选择数据库中的所有key。

flushall
删除所有数据库中的所有key。

multi
事务开始

exec
执行提交事务

discard
取消事务

watch key
监视给定的key
当exec 时候如果监视的key 从调用watch 后发生过变化,则整个事务会失败。也可以调用watch 多次监视多个key.这 样就可以对指定的key 加乐观锁了。
注意watch 的key 是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch 命令都会清除连接中的所有监视。

subscribe tv1 tv2
订阅频道

publish tv1 string
发布消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值