Redis 笔记

Redis 笔记

在这篇Redis笔记中,我详细记录了Redis的多种基本类型和操作,如String、List、Set、Hash和Zset,以及特殊数据类型和事务处理。还介绍了如何使用Bitmaps进行位操作和使用Geospatial进行地理位置存储。

Redis

基本类型

DEL key1 删除k-v

String

value不仅仅可以放值,还可以放数字等

基本

SET key1 v1				#设置值
GET key1   				#获取值
EXPIRE key1 60			#设置key的过期时间
TTL key1				#查看key的过期剩余时间
EXISTS key1				#是否存在
APPEND key1 lahaasdw	#追加字符串,没有key1就自动set
STRLEN key1   			#获取字符串长度

自增

INCR key1				#让key自增1
DECR key1				#让key自减1    (这两个不存在都会自己set一个)
INCRBY key1 10			#让key自增任意步长
DECRBY key1 10			#让key自增任意步长

范围

GETRANGE key1 0 3		#截取字符串范围 [start , end] (GETRANGE key1 0 -1 就可以查全部字符)
SETRANGE key1 2 xx		#offset value 把offset开始替换value个字节

条件

SETEX key1 60 asd		#set with expire 带过期时间的设置
SETNX key1 redisss		#set if not exist 如果不存在就set

批量

MSET k1 v1 k2 v2 k3 v3	#批量set
MGET k1 k2 k3			#批量get
MSETNX k1 v1 k4 v4		#如果全部不存在就批量set *原子性操作* 全部成功或全部失败

对象

SET user:1 {name:zhangsan,age:10}			#设置user:1对象 值为字符串 来保存对象
MSET user:1:name zhangsan user:1:age 2		#巧妙保存
MGET user:1:name user:1:age

其它

GETSET key1 redis							#先get出来再set出来

List

可以当成栈或队列,实际是一个双向链表,效率参考双向链表

所以有的list命令用L开头表示从头部(左)

LPUSH list one								#把一个值插入列表头部
LPUSH list two
LPUSH list three
LRANGE list 0 -1							#取出列表按头部插入顺序的 [start , end] 0 -1为全部
RPUSH list right							#插入队列尾部 注意是R
LPOP list									#从头部移除一个
LPOP list									#从尾部移除一个
Lindex list 1								#根据下标获取值
LLEN list									#获取长度 
LREM list 1 one								#count element 移除count个element值
LTRIM mlist 1 2								#通过下标修剪只剩下(1,2)的范围
RPOPLPUSH mlist list						#从一个列表尾部取出放到另外一个列表左边
EXISTS list									#看是否存在
LSET list 0 ite								#设置置顶下标 不存在下标或列表就报错
LINSERT list before wr xx					#在哪里插入
before是指L端
 
127.0.0.1:6379> LRANGE list 0 -1
1) "wr"
2) "he"
127.0.0.1:6379> LINSERT list before wr ,
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) ","
2) "wr"
3) "he"
127.0.0.1:6379> LINSERT list before he ,
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) ","
2) "wr"
3) ","
4) "he"

Set

SADD myset hello							#元素加入set
SMEMBERS myset								#查看set所有元素
SISMEMBER myset hello						#查看set中是否存在
SCARD myset									#查看set中的个数
SREM myset hello							#移除set中的指定元素
SRANDMEMBER myset							#随机显示一个元素
SPOP myset									#随机移除一个元素
SMOVE myset set hello7						#转移一个指定的元素
SDIFF myset set								#第一个set和第二个set求差集
SINTER myset set							#求交集
SUNION myset set							#求并集

Hash

hash更适合对象的存储!

HSET myhash field1 v1						#设置键值对
HGET myhash field1							#获取键值对
HGETALL myhash								#获取所有键值对
HMSET myhash field1 hello field2 he			#批量set
HMGET myhash field1 field2					#批量get
HDEL myhash field1							#获取长度
HEXISTS myhash field1						#判断是否存在
HKEYS myhash								#获取所有key
HVALS myhash								#获取所有value
HINCRBY myhash field9 2						#自增 还有hdecrby
HSETNX myhash field1 aaa					#如果不存在set

Zset

在set基础上增加了一个值

ZADD myset 2 two 3 three
ZRANGE myset 0 -1
ZRANGEBYSCORE salary -inf +inf				#只能最小到最大排序
ZRANGEBYSCORE salary -inf +inf withscores	#带上scores
ZREM salary xiaohong						#移除
ZCARD salary								#数量
ZREVRANGE salary 0 -1						#从大到小
ZCOUNT salary 0 100000						#计数

特殊

Geospatial地理位置

GEOADD city 113.565 22.248 zhuhai 114.109 22.544 shenzhen				#添加
GEODIST city zhuhai shenzhen km											#获取两地地方距离
GEOHASH city shenzhen zhuhai											#获取哈希值
GEOPOS city zhuhai														#获取精度和纬度
GEORADIUS city 105.2 30.01 1000 km withdist withcoord count 1			#寻找半径内指定数量并显示距离和经纬度
GEORADIUSBYMEMBER city guangzou 1000 km									#以某个为中心

底层是zset 可以用zset的命令

Hyperloglog

PFADD hll a b c d e f g							#添加
PFCOUNT hll										#统计不同元素的个数
PFMERGE hll2 hll my2							#合并两个到新的
 

Bitmaps

SETBIT sign 0 1
SETBIT sign 2 0									#设置
GETBIT sign 3									#获取
BITCOUNT sign 0 -1								#统计1的个数

事务

redis事务是保证按顺序执行

一次性、顺序性、排他性

没有隔离级别 不保证原子性

开启事务MULTI

MULTI

执行事务EXEC

EXEC

放弃事务DISCARD

DISCARD

异常

“编译型异常”所有都不会执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set v3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> get k5 
QUEUED
127.0.0.1:6379(TX)> set 
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec

“运行时异常”其它命令可以正常执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 vvv
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> set k2 qqq
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> get k2
"qqq"

锁WATCH

127.0.0.1:6379> WATCH money 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> DECRBY money 20
QUEUED
127.0.0.1:6379(TX)> INCRBY out 20
QUEUED

#
#在这另外一个线程修改money
#

127.0.0.1:6379(TX)> exec
(nil)

UNWATCH解锁

LICENSED UNDER CC BY-NC-SA 4.0
Comment