REDIS学习笔记(二):常用命令

redis学习笔记

参考文档

链接:https://pan.baidu.com/s/1sMUUYR3VGZcqPmJQNWeYDA  
密码:hf2n

常用命令介绍:

字符串命令
 	set key value time
 		设置key
 	get key 
 		查询key,当key不存在时,返回空结果。
 	incr key
 		递增数字,让当前键值递增,并返回递增后的值。当要操作的键不存在时,默认值为0.当值不是整数时,redis会提示错误。
 		使用incr命令,可以生成自增ID使用。
 	incrby key increment
 		给 key 增加 increment(具体数字)
 	decr key
 		递减数字
 	decrby key decrement
 		递减 decrement
 	incrbyfloat key increment
 		递增小数
 	append key value
 		向尾部追加值,如果键不存在,则将该键的值设为value,返回值是追加后字符串的总长度
 	strlen key
 		获取字符串长度,如果键不存在,返回0.
 	mget key1 key2 key3
 		同时获取多个键值
 	mset key1 v1 key2 v2 key3 v3
 		同时设置多个键值
 	getbit key num	
 		set foo bar 设置foo -> bar
 		获取key对应的值转成二进制后,第num位的数字
 	setbit key num 0或1
 		设置key对应的值转成二进制后,第num位的数字是0或1
 	bitcount命令可以获得字符串类型键中值是1的二进制位个数
 		redis> bitcount foo
 		(integer) 10
 		可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节
 		redis>bitcount foo 0 1
 		(integer) 6
 	keys * 
 		keys 命令会遍历redis中所有的键,当键的数量较多时会影响性能,不建议在生产环境使用。
 	exists key
 		判断key是否存在,存在返回1,不存在返回0.
 	del key
 		删除key,成功返回1,失败或者key不存在返回0.
 		技巧:del命令的参数不支持通配符,但是我们可以结合linux的管道符和xargs命令自己实现删除所有符合规则的键。比如要删除所有以“user:”开头的键,可以执行命令:redis-cli keys "user:*" | xargs redis-cli del. 另外,由于del命令支持多个键作为参数,所以还可以执行:redis-cli del 'redis-cli keys "user:*"'来达到同样效果,但是性能更好。

 	type key
 		获取键值的数据类型。string:字符串类型,hash:散列类型,list:列表类型,set:集合类型,zset:有序集合类型。
hash 散列 命令
		hset key field value 
			redis> hset car num 100
			(integer) 1
			当修改一个已存在的key时,返回0。 key不存在时,返回1

			hget key field
			redis> hget car num
			(integer) 100
			
			hmset key field value field1 value1
			hmget key field field1
			hgetall key

			hexists key field
				判断key下的field字段是否存在

			hsetnx
				该命令和hset类似,区别在于如果字段已经存在,hsetnx命令则不执行任何操作。

			hincrby key field 1
				使key下的field字段增加1,如果key不存在,会新建该键,并返回递增后的字段值。

			hdel key field field1
				删除一个或多个字段,返回被删除的字段个数

			hkeys key
				只获取散列类型 key 下的所有键名

			hvals key
				只获取散列类型 key 下的所有值

			hlen key
				获取 散列类型 key 的字段数量
hash 散列数据类型 实践:
	存储文章数据
			使用文章的缩略名作为文章的唯一标示,并且使用incr命令生成文章的ID
			$id = incr post:count;
			$suolue = 'wenzhangsuolue';
			// 判断文章缩略名是否可用
			$is_use = hsetnx wenzhang.to.id $suolue $id
			if($is_use==0) {
				// 文章缩略已存在
				exit;
			}
			// 保存文章信息
			hmset wenzhang:$id, title, $title, content, $content, suolue, $suolue

	查询文章
			当我们得到文章的缩略名,可以根据缩略名得到文章的id,进一步拿到文章数据
			$id = hget wenzhang.to.id $suolue
			if(empty($id)) {
				// 文章不存在
				exit;
			}
			$data = hgetall wenzhang:$id
			print 文章标题: $data.title

	编辑文章
			需要注意的是,如果修改了文章的缩略名,一定不能忘了修改wenzhang.to.id键对应的字段,如要修改ID为42的文章缩略名为$newsuolue:
			// 判断新缩略名是否可用
			$is_use = hsetnx wenzhang.to.id $newsuolue 42
			if($is_use==0) {
				// 新缩略名不可用
				exit;
			}
			// 获得旧的缩略名
			$old_suolue = hget wenzhang:42 suolue
			// 设置新的缩略名
			hset wenzhang:42 suolue $newsuolue
			// 删除旧的缩略名
			hdel wenzhang.to.id $old_suolue
list 列表 命令
		lpush key value value1 value2
		rpush key value value1 value2
			向列表 key 左右两端增加数据,返回值表示增加元素后列表的长度

		lpop key value value1 value2
		rpop key value value1 value2
			从列表 key 左右两端抛出数据

		llen key
			获取列表长度,当可以不存在时,返回0

		lrange key start stop
			lrange 命令能够获得列表 key 中的某一片段,将返回索引从start到stop之间的所有元素(包含两端的元素)。redis的列表起始索引为0.从左向右递增。如果start和stop为负数,则表示最右边的元素,例如:lrange key -2 -1,-1会返回最右边第一个元素,-2会返回最右边第二个元素。返回数据,但是不会删除队列中的数据(是和pop的不同之处)。

		lrem key num value
			lrem 命令会删除列表中前 num 个值为 value 的元素,返回值是实际删除的元素个数。根据num值的不同,lrem的执行方式会略有差异:1,当num>0:lrem会从左边开始删除数据;2,当num<0:lrem会从右边开始删除数据,删除-num个;3,当num=0;lrem会删除所有值为value的元素。

		lindex key index
			获得指定索引的元素值

		lset key index value
			设置指定索引的元素值

		lindex number 0
			把列表当作数组来使用,lindex命令用来返回指定索引的元素,索引从0开始,如果索引是负数,则表示从右边开始计算索引,最右边的索引是-1

		lset number num value
			设置指定索引的元素值

		ltrim key start end
			只保留列表指定片段,删除索引范围之外的所有元素,指定的列表范围和 lrange 相同,包含两端数字。ltrim 命令常常配合 lpush 命令使用,用来限制列表中的元素数量。比如我们只想保留最近的100条记录,则每次加入列表数据的时候,可以调用一次ltrim:
				lpush logs 'aaa'
				ltrim 0 99

		linsert key before|after pivot value
			向列表中插入元素。linsert 命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是before还是after来决定将value插入该元素的前面还是后面。改名了返回值是插入后列表的元素个数。

		rpoplpush source destination
			将元素从一个列表转到另一个列表。当source和destination相同时,该命令会不断的将队列尾部的元素移动到队首。借助这个特性,我们可以实现一个网站监控系统,使用一个队列存储需要监控的网址,然后监控程序不断的使用rpoplpush命令循环去除一个网址来测试可用性。这里使用该命令的好处在于程序执行过程中仍然可以不断的向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同时处理队列。
list 列表数据类型 实践:
		使用列表存储文章ID,当我们想删除一篇文章的时候,可以删除列表中的文章ID,当你想分页查询文章的时候,也可以在队列中获取文章ID。例如:
			我们在 wenzhang:list 中存储文章ID,发布新文章时,使用 lpush 把新文章的id放入列表,删除文章时,使用 lrem wenzhang:list $id 来删除文章ID,有了文章列表,就可以使用 lrange 命令来实现文章的分页了。
			$page_limit = 10;
			$start = ($this_page-1) * $page_limit;
			$end = $this_page * $page_limit -1;
			$ids = lrange wenzhang:list $start $end;
			为了获取文章内容,我们需要循环获取的ID列表,来读取文章:
			for each $id in $ids:
				$wenzhang = hgetall wenzhang:$id
				print 文章标题:$wenzhang.title

			美中不足的是 散列类型 没有类似字符串类型的 mget 命令那样可以通过一条命令同时获取多个键的键值的功能,所以对于每个文章ID都需要请求一次数据。

			2,存储文章的评论列表
				思路:把每一条评论的各个元素信息序列化后存到 列表类型 的元素中。
				我们使用 wenzhang:$id:comments 来存储某个文章的所有评论。逻辑如下:
				$serializedComment = serialize($author, $email, $time, $content);
				lpush wenzhang:$id:commnent $serializedComment
set 集合 命令
		sadd key value value1
			向集合 key 中添加 value 和 value1,如果键不存在,会自动创建。因为在一个集合中不能有相同的元素,所以要加入的元素已经存在于集合中就会忽略这个元素。本命令返回值是成功加入的元素数量(忽略的元素不计算在内)。

		srem key value value1
			从集合 key 删除 value 和 value1,返回值是删除成功的元素个数。

		smembers key
			获得集合中的所有元素

		sismember key value
			判断元素 value 是否在集合 key 中,当值存在时返回1,当值不存在或者键不存在时返回0。

		集合运算
			sdiff key kye1 key2
				对多个集合进行差集运算,sdiff key1 key:会返回属于集合key1但不属于集合key2的数据。sdiff key1 key2 key3:先对key1和key2进行差集运算,然后使用结果与key3进行差集运算,返回最终结果。
			sinter key key1 key2
				对多个集合进行交集运算,sinter key key1:会返回既属于集合key又属于集合key1的元素。sinter key1 key2 key3:先对key1和key2进行交集运算,然后使用结果与key3进行交集运算,返回最终结果。
			sunion key key1 key2
				对多个集合进行并集运算

		scard key
			获得集合中元素个数

		进行集合运算并将结果存储
			sdiffstore destination key key1 key2
			sinterstore destination key key1 key2
			sunionstore destination key key1 key2
			运算命令和集合运算逻辑相同,sdiffstore和sdiff命令的区别是前者会将与暗算结果存储在destination键中,而不是直接返回。

		srandmember key [count]
			随机从集合中获取一个元素,也可以传递count参数来一次随机获取多个元素,根据count参数的正负不同,具体表现也不同。
				当count为正数时:会随机从集合里获得count个不重复的元素。如果count大于集合中的元素个数,则srandmember返回集合中的全部元素。
				当count为负数时:srandmember会随机从集合中返回-count个元素,这些元素有可能相同。

		spop key
			从集合中随机弹出一个元素
set 集合数据类型 实践:
		考虑到一篇文章的所有标签都是互不相同的,而且展示时对这些标签的排列顺序并没有要求,我们可以使用集合类型键存储文章标签。
		给ID为42的文章增加标签
		sadd wenzahng:42:tags tag tag1 tag2
		删除标签
		srem wenzhang:42:tags tag tag1
		显示所有的标签
		$tags = smembers wenzhang:42:tags
		print $tags

		通过标签搜索文章:
			为了找到同时属于“java”、“mysql”、“redis”这位三个标签的文章。假设文章ID为1、2、3,其中1包含“java”,2包含“java”、“mysql”,3包含“java”、“mysql”、“redis”。在文章存储标签的集合中,使用 sadd wenzhang:1:tag java 来实现。同时,反向存储一下标签关联文章的集合, sadd tag:$tag:wenzahng 1,这样在有根据标签查询的场景下,就可以通过 smembers tag:java:wenzhang 来获取所有关联了“java”标签的文章id了,如果有多个标签,只需要对集合进行交集运算就可以了。	
sorted set 有序集合 命令
	有序集合类型在某些方面和列表类型有些相似。
		1,二者都是有序的。
		2,二者都可以获得某一范围的元素。
	但是,二者有着很大的区别,这使得他们的应用场景也是不同的。
		1,列表类型时通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更适合实现如“新鲜事”、“日志”这样很少访问中间元素的应用。
		2,有序集类型是使用散列表和跳跃表(skip list)来实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
		3,列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
		4,有序集合要比列表类型更耗费内存。

	zadd key score member [score member ...]
		向有序集合 key 中添加一个元素和该元素的分数,如果元素已存在则会用新的分数替换原有的分数。zadd命令返回的是新加入到集合中的元素个数(不包含之前已经存在的元素)。分数不仅可以是整数,还支持双进度浮点数。

	zscore key member
		获取有序集合 key 下 member 元素的分数。

	zrange key start stop [withscores]
	zrevrange key start stop [withscores]
		zrange 命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。如果需要同时获得元素的分数的话可以在 zrange 命令的尾部加上 withscores 参数,这是返回的数据格式就从“元素1、元素2、元素3...”变成了“元素1、分数1、元素2、分数2...”。
		zrange命令的时间复杂度为O(logn+m)(其中n为有序集合的基数,m为返回的元素个数)。 
		如果两个元素的分数相同,redis会按照字典顺序(0<9<A<Z<a<z)来进行排列。
		zrevrange 命令按照元素分数从大到小排序。

	zrangebyscore key min max [withscores] [limit offset count]
		该命令按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素。如果希望分数范围不包含端点值,可以在分数前加上“(”符号,例如:返回80-100分的数据,可以包含80,但不包含100,命令为:
			redis> zrangebyscore key 80 (100 
		min和max还支持无穷大,同zadd命令一样,-inf和+inf分别表示负无穷和正无穷。比如你希望得到所有分数高于80(不包含80)的人的名单,但是你却不知道最高分是多少,命令如下:
			redis>zrangbyscore key (80 +inf
		withscores用法和zrange相同。
		如果你想获得分数高于60分的从第二个人开始的3个人,命令如下:
			redis>zrangebyscore key 60 +inf limit 1 3

	zrevrangebyscore key max min [withscores] [limit offset count]
		该命令是按照分数从大到小返回元素。需要注意最大最小值参数的位置。

	zincrby key increment member
		zincrby 命令可以增加一个元素的分数,返回值是更改后的分数。例如想给jerry加4分:
			redis>zincrby key 4 jerry
		也可以是负数表示减分。

	zcard key
		获得集合中元素的数量。

	zcount key min max
		获得指定分数范围内的元素个数。

	zrem key member [member ...]
		删除一个或多个元素。返回值是成功删除的元素数量(不包含本来就不存在的元素)。

	zremrangebyrank key start stop
		按照元素分数从小到大的顺序删除处在指定排名范围内的所有元素,并返回删除的元素数量。索引从0开始。

	zremrangebyscore key min max
		删除指定分数范围内的所有元素。参数min和max和zrangebyscore命令中的一样,返回值是删除的元素数量。

	zrank key member
	zrevrank key member
		zrank 命令会按照元素分数从小到大的顺序获得指定的元素的排名(从0开始,即分数最小的元素排名为0)。zrevrank 命令则相反(分数最大的元素排名为0)。

	zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
		zinterstore 命令用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中的元素个数。
		destination键中的元素的分数是由aggregate参数决定的。
			1,当aggregate是sum时(也就是默认值),destination键中的元素的分数是每个参与计算的集合中该元素分数的和。
			2,当aggregate是min时,destination键中元素的分数时每个参与计算的集合中该元素分数的最小值。
			3,当aggregate是max时,destination键中元素的分数时每个参与计算的集合中该元素分数的最大值。
		zinterstore 命令还能够通过weights参数设置每个几个的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重。

		另一个命令与zinterstore的用法相同,zunionstore,他的作用是计算集合之间的并集。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值