1.Redis入门
基础命令:
keys *
获取所有key
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
4) "name"
exists [keyname]
是否存在key
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k0
(integer) 0
127.0.0.1:6379> expire k1 10 #对已存在的key设置过期时间
(integer) 1
127.0.0.1:6379> ttl k1 # 获取key的剩余时间
(integer) 5
127.0.0.1:6379> setex k0 20 jklopq #创建key时,设置过期
OK
127.0.0.1:6379> ttl k0
(integer) 15
127.0.0.1:6379> ttl k0
(integer) 13
127.0.0.1:6379> setnx k0 'jklasd' # 如果不存在key,设置,返回1
(integer) 1
127.0.0.1:6379> get k0
"jklasd"
127.0.0.1:6379> setnx k0 'zxc' # 如果存在key,不设置,返回0
(integer) 0
127.0.0.1:6379> get k0
"jklasd"
type [keyname]
键值对类型
127.0.0.1:6379> type k2
string
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量设置
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3 # 批量获取
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> mset k1 v3 k4 v4 # 设置并替换
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k4"
4) "k2"
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v3"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> msetnx k1 v3 k4 v4 # 不存在再设置,存在即失败,且具有原子性,要么都失败,要么都成功
(integer) 0
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
1.1.五大数据类型
String
redis会自动识别字符串、整数、浮点数,这三种值,归结为String
127.0.0.1:6379> set k1 v1 #设置String
OK
127.0.0.1:6379> get k1 # 获取key的值
"v1"
127.0.0.1:6379> APPEND k2 "hh" #追加字符串,如果不存在,则新建
(integer) 4
127.0.0.1:6379> STRLEN k2 #获取字符串长度
(integer) 4
127.0.0.1:6379> incr num # 自增
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
127.0.0.1:6379> decr num # 自减
(integer) 2
127.0.0.1:6379> decr num
(integer) 1
127.0.0.1:6379> decr num
(integer) 0
127.0.0.1:6379> incrby num 10 # 指定num增加10
(integer) 10
127.0.0.1:6379> incrby num 20
(integer) 30
127.0.0.1:6379> decrby num 5 # 指定num减5
(integer) 25
#################################截取,替换
127.0.0.1:6379> set k4 abcdefg
OK
127.0.0.1:6379> GETRANGE k4 0 4 # 截取0~4号位字符串
"abcde"
127.0.0.1:6379> get k4
"abcdefg"
127.0.0.1:6379> GETRANGE k4 0 -1 # 获取全部字符串 等同于get key
"abcdefg"
127.0.0.1:6379> SETRANGE k4 3 '666' # 替换 ,相当于java的replace
(integer) 7
127.0.0.1:6379> GET k4
"abc666g"
#################################对象
127.0.0.1:6379> mset person:1:name queen person:1:age 18
OK
127.0.0.1:6379> keys *
1) "person:1:age"
4) "person:1:name"
127.0.0.1:6379> mget person:1:name person:1:age
1) "queen"
2) "18"
###################################getset
127.0.0.1:6379> getset k0 hello #获取旧的值,并设置新的值
(nil)
127.0.0.1:6379> get k0
"hello"
127.0.0.1:6379> getset k0 world
"hello"
127.0.0.1:6379> get k0
"world"
List
有序重复集合,大部分命令都是以“l”开头的
127.0.0.1:6379> lpush list a #lpush [keyname] value 左插入值
(integer) 1
127.0.0.1:6379> lpush list b
(integer) 2
127.0.0.1:6379> lpush list c
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # lrange [keyname] 0 -1 遍历list
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush list d #rpush [keyname] value 右插入值
(integer) 4
127.0.0.1:6379> rpush list e
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
127.0.0.1:6379> lpop list # 左移除第一个元素,并返回
"c"
127.0.0.1:6379> rpop list # 移除最后一个元素,并返回
"e"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "a"
3) "d"
127.0.0.1:6379> lindex list 0 # 通过下标获取值
"b"
127.0.0.1:6379> Llen list # 获取长度
(integer) 3
###############################################移除指定的值
127.0.0.1:6379> lrem list 1 b # lrem [keyname] 数量 value 移除指定数量的指定的值 这里为移除1个b
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "d"
###############################################截取
127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> ltrim list 2 3 # 截取下标2至下标3的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "d"
###############################################移动
127.0.0.1:6379> rpoplpush list list2 # 移除list种最右边的元素,移动到list2的最左侧
"d"
127.0.0.1:6379>
127.0.0.1:6379> lrange list 0 -1
1) "c"
127.0.0.1:6379> lrange list2 0 -1
1) "d"
127.0.0.1:6379> rpush list d e f
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "d"
3) "e"
4) "f"
###更新、插入
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> lset list 1 ddd # `lset [keyname] 下标 newValue` 更新下标1的元素, 如果集合或下标不存在,会报错
OK
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "ddd"
3) "e"
127.0.0.1:6379> linsert list after e f #`linsert [keyname] after vlaue newvalue` 往e的后面插入新值f
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "ddd"
3) "e"
4) "f"
127.0.0.1:6379> linsert list before c b # `linsert [keyname] before value newvalue` 往c的前面插入新值b
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "ddd"
4) "e"
5) "f"
- 如果移除了所有值,空链表,也代表不存在!
- 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点
- 可以用list做消息队列,栈
Set
无序不重复的集合,大部分以s开头
127.0.0.1:6379> sadd set v1 v2 v3 # `sadd [keyname] value` 添加元素 直接添加3个元素
(integer) 3
127.0.0.1:6379> sadd set v1 # 添加重复元素,失败,返回0
(integer) 0
127.0.0.1:6379> smembers set # 遍历set的原色
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> sismember set v1 # `sismember [keyname] value` 查看元素是否存在
(integer) 1
127.0.0.1:6379> sismember set v5
(integer) 0
127.0.0.1:6379> scard set # 获取set中元素个数
(integer) 3
127.0.0.1:6379> srem set v1 # 移除元素
(integer) 1
127.0.0.1:6379> smembers set
1) "v3"
2) "v2"
127.0.0.1:6379> SRANDMEMBER set # SRANDMEMBER随机取出一个元素
"v4"
127.0.0.1:6379> SRANDMEMBER set
"v5"
127.0.0.1:6379> spop set # 随机移除一个元素
"v4"
127.0.0.1:6379> smembers set
1) "v3"
2) "v2"
3) "v1"
4) "v5"
127.0.0.1:6379> smove set set2 v5 # `smove [set1name] [set2name] value` 从集合1移动指定的元素到集合2中
(integer) 1
127.0.0.1:6379> smembers set
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> smembers set2
1) "v5"
# 差集、交集、并集
127.0.0.1:6379> sadd set2 v1
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "v1"
2) "v5"
127.0.0.1:6379> SMEMBERS set
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> SDIFF set set2 # 两个集合的差集
1) "v3"
2) "v2"
127.0.0.1:6379> SUNION set set2 # 两个集合的并集
1) "v3"
2) "v1"
3) "v2"
4) "v5"
127.0.0.1:6379> SINTER set set2 # 两个集合的交集
1) "v1"
- 总结:可实现共同好友、共同关注等需求。
Hash
key-map集合,大多以h开头
127.0.0.1:6379> hset hash1 k1 v1 # `hset [hashName] [map-kay] [map-value]` 设置一个hash
(integer) 1
127.0.0.1:6379> hget hash1 k1 # 获取hash1中的k1的值
"v1"
127.0.0.1:6379> hmset hash1 k2 v2 k3 v3 # 批量设置
OK
127.0.0.1:6379> hmget hash1 k1 k2 k3 # 批量读取
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> hgetall hash1 # 获取所有的键和所有的值
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
127.0.0.1:6379> hdel hash1 k1 # 删除指定的map
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "k2"
2) "v2"
3) "k3"
4) "v3"
127.0.0.1:6379> hlen hash1 # 获取hash的map数量
(integer) 2
127.0.0.1:6379> HEXISTS hash1 k2 # 判断hash中指定的字段是否存在
(integer) 1
127.0.0.1:6379> HEXISTS hash1 k1
(integer) 0
127.0.0.1:6379> HSETNX hash1 k2 v2 # 存在不添加,返回0
(integer) 0
127.0.0.1:6379> HSETNX hash1 k6 v6 # 不存在,则添加,返回1
(integer) 1
127.0.0.1:6379> hkeys hash1 # 获取所有的key
1) "k2"
2) "k3"
127.0.0.1:6379> hvals hash1 # 获取所有的值
1) "v2"
2) "v3"
127.0.0.1:6379> hmset hash1 k4 4 k5 5
OK
127.0.0.1:6379> HINCRBY hash1 k4 1 #`HINCRBY [hashName] [map-key] 值` 设置k4自增1
(integer) 5
127.0.0.1:6379> HINCRBY hash1 k4 -3 #设置k4减3
(integer) 2
ZSet
有序不重复的集合
127.0.0.1:6379> zadd zset1 1 a 2 b 3 c #`zadd [keyname] 排序值 value` 批量添加元素
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 # 遍历所有元素
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zadd zset1 20 d 50 e 30 f
(integer) 3
127.0.0.1:6379> ZRANGEBYSCORE zset1 -inf +inf # #将zset的值根据key来从小到大排序并输出
1) "a"
2) "b"
3) "c"
4) "d"
5) "f"
6) "e"
127.0.0.1:6379> ZRANGEBYSCORE zset1 0 20 # 只查询key<=20的值并且排序从小到大
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> ZREVRANGE zset1 0 -1 # 倒序
1) "e"
2) "f"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> ZRANGEBYSCORE zset1 -inf +inf withscores # 查询指定zset的所有值,包含序号的值
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "20"
9) "f"
10) "30"
11) "e"
12) "50"
127.0.0.1:6379> zrem zset1 c # 移除元素
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
3) "d"
4) "f"
5) "e"
127.0.0.1:6379> zcard zset1 # 查元素个数
(integer) 3
127.0.0.1:6379> zrangebyscore zset1 -inf +inf withscores
1) "d"
2) "20"
3) "f"
4) "30"
5) "e"
6) "50"
127.0.0.1:6379> zcount zset1 20 30 # 查区间的元素个数
(integer) 2
1.2.三大特殊数据类型
1.2.1.geospatial:地理位置
查询城市经纬度,底层的实现原理是ZSet
,可以用ZSet的命令
- geoadd
语法·geoadd [keyname] [经度] [纬度] 地理名称·
127.0.0.1:6379> geoadd city 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" # 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
(integer) 2
127.0.0.1:6379> geopos city Palermo Catania # 获取指定城市的经纬度
1) 1) "13.361389338970184"
2) "38.115556395496299"
2) 1) "15.087267458438873"
2) "37.50266842333162"
127.0.0.1:6379> ZRANGE city 0 -1 #查所有城市
1) "Palermo"
2) "Catania"
127.0.0.1:6379> GEODIST city Palermo Catania # 两个城市之间的距离默认单位:米
"166274.1516"
127.0.0.1:6379> GEODIST city Palermo Catania km # 两个城市之间的距离指定单位:千米
"166.2742"
- GEORADIUS
语法GEORADIUS [keyname] 经度 纬度 半径
127.0.0.1:6379> GEORADIUS city 15 37 200 km # 找以经度15,纬度37为中心,半径200KM的城市
1) "Palermo"
2) "Catania"
127.0.0.1:6379> GEORADIUS city 15 37 200 km withdist # 找以经度15,纬度37为中心,半径200KM的城市,并打印出直线距离
1) 1) "Palermo"
2) "190.4424"
2) 1) "Catania"
2) "56.4413"
127.0.0.1:6379> GEORADIUS city 15 37 200 km withcoord # 找以经度15,纬度37为中心,半径200KM的城市,并打印出经纬度
1) 1) "Palermo"
2) 1) "13.361389338970184"
2) "38.115556395496299"
2) 1) "Catania"
2) 1) "15.087267458438873"
2) "37.50266842333162"
127.0.0.1:6379> GEORADIUS city 15 37 200 km count 1 # 找以经度15,纬度37为中心,半径200KM的城市,找其中一个
1) "Catania"
127.0.0.1:6379> GEORADIUS city 15 37 200 km withcoord withdist count 2
1) 1) "Catania"
2) "56.4413"
3) 1) "15.087267458438873"
2) "37.50266842333162"
2) 1) "Palermo"
2) "190.4424"
3) 1) "13.361389338970184"
2) "38.115556395496299"
- GEORADIUSBYMEMBER
127.0.0.1:6379> GEOADD city 13.583333 37.316667 "Agrigento"
(integer) 1
127.0.0.1:6379> GEORADIUSBYMEMBER city Agrigento 100 km # 找以“Agrigento”为中心,半径200KM的城市
1) "Agrigento"
2) "Palermo"
- GEOHASH
该命令将返回11个字符的Geohash字符串
127.0.0.1:6379> GEOHASH city Palermo Catania # 返回城市的hash值
1) "sqc8b49rny0"
2) "sqdtr74hyu0"
1.2.2.Hyperloglog:基数
基数统计算法,占用的内存是固定的,2^64个元素,相当于只需要12kb的内存即可。效率极高!
127.0.0.1:6379> pfadd h11 a b c d e f g # 添加数据集
(integer) 1
127.0.0.1:6379> pfcount h11 # 统计元素个数
(integer) 7
127.0.0.1:6379> pfadd h12 h i j k l m n
(integer) 1
127.0.0.1:6379> pfmerge h12 h11 # 将h11数据合并到h12,并且去重
OK
127.0.0.1:6379> pfcount h12
(integer) 14
127.0.0.1:6379> pfcount h11
(integer) 7
1.2.3.Bitmap 位存储
Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
可以记录登陆信息,打卡记录等状态
127.0.0.1:6379> setbit bit1 1 1 # `setbit [keyname] 描述key 0/1` 设置1的值为1
(integer) 0
127.0.0.1:6379> setbit bit1 2 1
(integer) 0
127.0.0.1:6379> setbit bit1 3 0 # 设置3的值为0
(integer) 0
127.0.0.1:6379> setbit bit1 4 0
(integer) 0
127.0.0.1:6379> getbit bit1 1 # 获取1的值
(integer) 1
127.0.0.1:6379> SETBIT bit1 1 0
(integer) 1
127.0.0.1:6379> GETBIT bit1 1
(integer) 0