学习途径
官网:Redis
中文网:redis中文官方网站
b站:狂神说
数据类型
五大数据类型
官网
String
进程号:6379
Redis命令中心(Redis commands) – Redis中国用户组(CRUG)
- 追加字符串内容;key不存在,相当于新增键值对
append key "新增内容"
- 自增1;若key不存在,先set为0,再加1
incr key //increase
- 自减1
decr key
- key值增加一个整数
incrby key increment
- 根据下标范围截取字符串 闭区间
getrange key 0 3 //[0,3]
getrange key 0 -1 //截取下标0~末尾
- 替换内容
setrange key 3 value //从下标三开始往后替换为value
eg: "xxx hhh"
SETRANGE name 3 --
"xxx--hhh"
- setex(set with expire) 设置并追加过期时间
- setnx(set if not exist) 若不存在则设置,在分布式锁中会经常用到;是原子性的操作,要么都成功,要么都失败
- 批量设置
mset k1 1 k2 2 k3 xdd k4 sdff
- 批量获取
mget k1 k2 k3 k4
msetnx k1 v1 k4 v4 //会失败,k1已存在,是原子性操作
- 先取再赋值;当前值不存在则返回null,并赋值;当前值存在则返回d
getset key value
List
list的命令多以l开头的
list允许有重复元素
底层逻辑是Deque(双端队列)
- lpush key value
头插
- rpush key value
尾插
- lset key index item
给列表指定下标关联新的键值对
若list不存在,操作失败
若超出索引界限,操作失败
即只能在列表现有的元素进行更新
- lrange key start end
列出元素
- lpop key
- rpop key
- lindex key index
获取下标所指的值
- llen key
获取列表长度
- lrem key count value
List允许有重复元素,移除count个指定的元素
- trim list start end
修剪,列表只保留指定区间的元素,list被改变
- rpoplpush list1 list2
移除list1的尾端元素并将其添入list2的头部
- linsert key before/after value1 value2
在指定列表的 value1的前/后插入值value2
Set
set的命令多以s开头
无序不重复集合
Redis命令中心(Redis commands) – Redis中国用户组(CRUG)
- sadd key value
集合添加值
- smembers key
查看集合的所有值
- sismember key member
查看集合中是否有某个值
- scard key
获取集合的长度
- SREM key member [member ...]
移除元素
- SDIFF k1 k2
列出k1中与k2不同的元素 差集
- sunion 并集
- sinter 交集
Hash
Map集合,key-<field域-value值>
HDEL key field [field ...]
删除一个或多个Hash的field
HEXISTS key field
判断field是否存在于hash中
HGET key field
获取hash中field的值
HGETALL key
从hash中读取全部的域和值
HINCRBY key field increment
将hash中指定域的值增加给定的数字
HINCRBYFLOAT key field increment
将hash中指定域的值增加给定的浮点数
HKEYS key
获取hash的所有键值对
HLEN key
获取hash里所有键值对的数量
HMGET key field [field ...]
获取hash里面指定字段的值
HMSET key field value [field value ...]
设置hash字段值
HSET key field value
设置hash里面一个字段的值
HSETNX key field value
设置hash的一个字段,只有当这个字段不存在时有效
HSTRLEN key field
获取hash里面指定field的长度
HVALS key
获得hash的所有值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代hash里面的元素
Zset
有序集合
添加元素时必须指定优先级(core)
- zrange start end
列出元素,默认就是按照优先级升序
- ZRANGEBYSCORE salary -inf +inf
从小到大列出 负无穷 正无穷
三种特殊数据类型
geospatial
城市经纬度查询-国内城市经度纬度在线查询工具 (jsons.cn)
GEOADD key longitude(经度) latitude(纬度) member [longitude latitude member ...]
添加一个或多个地理空间位置到sorted set
GEOHASH key member [member ...]
返回一个标准的地理空间的Geohash字符串
GEOPOS key member [member ...]
返回地理空间的经纬度
GEODIST key member1 member2 [unit]
返回两个地理空间之间的距离
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
查询指定经纬度为中心 指定的半径内所有的地理空间元素的集合。
radius 半径
WITHDIST 显示直线距离
WITHCOORD 显示经纬度
COUNT count 限定查询个数
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
查询指定半径内匹配到的最大距离的一个地理空间元素。中心点由指定元素定义
hyperloglog
用于做基数统计的算法
基数:一个集合中不重复的元素的数量
底层逻辑:set,元素无序不可重复
占用内存固定:只需12KB内存
PFADD key element [element ...]
将指定元素添加到HyperLogLog
PFCOUNT key [key ...]
返回基数值
PFMERGE destkey sourcekey [sourcekey ...]
合并两个集合
bitmaps
在官网还是属于String类型
记录两个状态的(0或1)都可以用这个
按位来存储的
8bit = 1字节
setbit
getbit
bitcount
事务
事务ACID原则------>**要么都成功,要么都失败
原子性
一致性
隔离性
持久性
Redis单条命令是保证原子性的,但是Redis的事务不保证原子性,Redis事务也没有隔离级别的概念
在传统的关系型数据中,只要有任意一条指令失败,则整个事务都会被撤销回滚,而在Redis中,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做,也因此得出 Redis 事务的执行不保证原子性(前提没有编译时异常)
Redis事务本质:一组命令的集合,一次性、顺序性、排他性的执行
Redis的事务:
- 开启事务(multi)
- 命令入队(…)
- 执行事务(exec)
正常执行事务
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
3) "v2"
放弃事务 discard
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> get k4
QUEUED
127.0.0.1:6379(TX)> DISCARD
OK
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
(nil)
编译型异常(代码有问题,命令有错),事务中的所有命令都不会被执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> getset k1 //语法错误,getset value1 value2
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> EXEC //执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k2 //所有的命令都不会执行
(nil)
运行时异常(I/O),如果事务队列存在语法性(语法没有问题),那么执行命令的时候,其他命令可以正常运行 这也验证了Redis的事务没有原子性
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 "v1" //将k1设置为字符串
QUEUED
127.0.0.1:6379(TX)> INCR k1 //使k1自增,语法正确,但字符串无法加一,出现运行时异常
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> EXEC //所有命令都能执行
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK
5) "v3"
|