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
解锁