Redis
Redis简介
redis是一个完全开源的高性能key-value数据库。支持数据的持久化,可以将内存中的数据持久化到我们的以盘中
数据结构
- string
- list
- set
- zset
- hash
Redis的安装
String类型
-- 字符串操作
127.0.0.1:6379> SET name coder # 设置字符串
OK
127.0.0.1:6379> GET name # 获取字符串
"coder"
127.0.0.1:6379> EXISTS name # 判断是否存在
(integer) 1
127.0.0.1:6379> APPEND name -circle # 追加字符串
(integer) 12
127.0.0.1:6379> GET name
"coder-circle"
127.0.0.1:6379> STRLEN name # 获取字符串的长度
(integer) 12
127.0.0.1:6379>
127.0.0.1:6379> SET hello 'hello,world'
OK
127.0.0.1:6379> GET hello
"hello,world"
127.0.0.1:6379> GETRANGE hello -5 -1 # 截取字符串
"world"
127.0.0.1:6379> GETRANGE hello 0 5
"hello,"
127.0.0.1:6379> SETRANGE hello 6 java! # 替换字符串
(integer) 11
127.0.0.1:6379> GET hello
"hello,java!"
-- 数值加减
127.0.0.1:6379> SET num 0
OK
127.0.0.1:6379> GET num
"0"
127.0.0.1:6379> INCR num # +1
(integer) 1
127.0.0.1:6379> GET num
"1"
127.0.0.1:6379> DECR num # -1
(integer) 0
127.0.0.1:6379> GET num
"0"
###
127.0.0.1:6379> INCRBY num 10 # +10
(integer) 10
127.0.0.1:6379> GET num
"10"
127.0.0.1:6379> DECRBY num 5 # -5
(integer) 5
127.0.0.1:6379> get num
"5"
127.0.0.1:6379>
127.0.0.1:6379> FLUSHDB -- 清空当前数据库内容
127.0.0.1:6379> FLUSHALL -- 清空所有数据库内容
127.0.0.1:6379> SETEX hello 30 'hello world' # 设置hello的值 30秒后过期
OK
127.0.0.1:6379> TTL hello # hello过期剩余时间
(integer) 14
127.0.0.1:6379> TTL hello
(integer) -2 # hello已过期
127.0.0.1:6379> SETNX hello 'hahha' # 如果hello不存在,创建成功
(integer) 1
127.0.0.1:6379> SETNX hello 'hahha' # 如果hello存在,创建失败
(integer) 0
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 # 同时设置多个值
OK
127.0.0.1:6379> MGET k1 k2 k3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
###
127.0.0.1:6379> MSETNX k1 v1 k4 v4 -- 原子性 # 如果不存在则创建多个值
(integer) 0
127.0.0.1:6379> MSETNX k4 v4 k5 v5
(integer) 1
127.0.0.1:6379> MGET k4 k5
1) "v4"
2) "v5"
###
# 这里key是一个巧妙地设计:user:{id}:{filed}, 可以根据大括号内容不同设置不同的值
127.0.0.1:6379> MSET user:1:name zs user:1:age 20
OK
127.0.0.1:6379> MGET user:1:name user:1:age
1) "zs"
2) "20"
###
127.0.0.1:6379> GETSET db haha # 如果不存在则设置值
(nil)
127.0.0.1:6379> GET db
"haha"
127.0.0.1:6379> GETSET db 'wawa' # 如果存在,则获取值,然后设置新的值
"haha"
127.0.0.1:6379> GET db
"wawa"
127.0.0.1:6379>
List
# 向列表插入数据
127.0.0.1:6379> LPUSH list one two three # 将一个值或多个值插入列表的头部
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list 0 # 将一个值或多个值插入列表的尾部
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "0"
# 从列表取出数据
127.0.0.1:6379> LPOP list 2 # 从左边取出
1) "5"
2) "three"
127.0.0.1:6379> RPOP list 1 # 从右边取出
1) "0"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
# 通过下标获取值
127.0.0.1:6379> LINDEX list 0
"two"
127.0.0.1:6379> LINDEX list 1
"one"
127.0.0.1:6379> llen list # 返回列表长度
(integer) 2
# 从列表中删除元素
127.0.0.1:6379> LREM list 1 one `127.0.0.1:6379> LREM key count element`
(integer) 1
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> LPUSH list one two three four five six
(integer) 6
127.0.0.1:6379> LPUSH list three three
(integer) 8
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "six"
4) "five"
5) "four"
6) "three"
7) "two"
8) "one"
127.0.0.1:6379> LREM list 3 three # 删除3个three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "six"
2) "five"
3) "four"
4) "two"
5) "one"
# 裁剪 trim
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH list hello1 hello2 hello3 hello4 hello5
(integer) 5
127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定长度
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
2) "hello3"
# 从list取出放入olist中
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> RPUSH list hello0 hello1 hello2 hello3
(integer) 4
127.0.0.1:6379> RPOPLPUSH list olist
"hello3"
127.0.0.1:6379> LRANGE olist 0 -1
1) "hello3"
#lset更新操作
127.0.0.1:6379> LPUSH list v1
(integer) 1
127.0.0.1:6379> LSET list 0 v0 #如果list不存在 会报错
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "v0"
127.0.0.1:6379> LINSERT list after v0 v1 # -- LINSERT key BEFORE|AFTER pivot element
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "v0"
2) "v1"
127.0.0.1:6379> LINSERT list before v1 v0.5
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "v0"
2) "v0.5"
3) "v1"
小结
- List实际上是一个链表,before ,after,left,right都可以插入
- 如果key不存在,创建新的链表
- 如果移除了所有值,空链表,也表示不存在!
- 在两边插入或者改动值,效率最高。中间元素,相对来说效率会低一些
消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)
Set(集合) 值不可以重复
127.0.0.1:6379> sadd set 'hello' 'world' 'hello' 'redis'
(integer) 3
127.0.0.1:6379> SMEMBERS set # 查看set集合中的所有元素
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> SISMEMBER set hello # 判断是否存在
(integer) 1
127.0.0.1:6379> SISMEMBER set java
(integer) 0
127.0.0.1:6379> sadd set world # 不可以添加重复元素
(integer) 0
127.0.0.1:6379> SREM set world # 移除set中的指定元素
(integer) 1
127.0.0.1:6379> SRANDMEMBER set 2 # 从set集合中随机筛选指定个数个元素
1) "hello"
2) "redis"
127.0.0.1:6379> SRANDMEMBER set 1
1) "redis"
# 将一个元素从一个集合中移动到另一个集合中
127.0.0.1:6379> sadd set1 hello world redis java
(integer) 4
127.0.0.1:6379> SMOVE set1 set2 java
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> SMEMBERS set2
1) "java"
# 微博,B站,共同关注!
数字集合类
- 差集 SDIFF
- 交集 SINTER
- 并集 SUNION
127.0.0.1:6379> SADD mem1 a b c d
(integer) 4
127.0.0.1:6379> SADD mem2 a c d e f
(integer) 5
127.0.0.1:6379> SDIFF mem1 mem2 # sdiff返回第一个集合与其他集合之间的差异,(第一个集合特有的元素)
1) "b"
127.0.0.1:6379> SDIFF mem2 mem1
1) "f"
2) "e"
127.0.0.1:6379> SINTER mem1 mem2 # 交集 (共同好友)
1) "d"
2) "c"
3) "a"
127.0.0.1:6379> SUNION mem1 mem2 # 并集
1) "f"
2) "d"
3) "c"
4) "b"
5) "e"
6) "a"
Hash(哈希)
127.0.0.1:6379> HSET person name zs age 20 # 设置k-v值 可以多个
(integer) 2
127.0.0.1:6379> HGET person name # 获取对应k的值
"zs"
127.0.0.1:6379> HGET person age
"20"
127.0.0.1:6379> HMGET person name age # 获取对应k的值 可以获取多个
1) "zs"
2) "20"
127.0.0.1:6379> HDEL person age # 删除指定k的值
(integer) 1
127.0.0.1:6379> HMGET person name age
1) "zs"
2) (nil)
127.0.0.1:6379> HSET person height 180 weight 140
(integer) 2
127.0.0.1:6379> HGETALL person # 获取全部hash表的信息
1) "name"
2) "zs"
3) "height"
4) "180"
5) "weight"
6) "140"
127.0.0.1:6379> HLEN person # 获取hash表的元素数量
(integer) 3
127.0.0.1:6379> HEXISTS person name # 判断key是否存在
(integer) 1
127.0.0.1:6379> HEXISTS person age
(integer) 0
127.0.0.1:6379> HKEYS person # 获取全部key
1) "name"
2) "height"
3) "weight"
127.0.0.1:6379> HVALS person # 获取全部value
1) "zs"
2) "180"
3) "140"
4) 127.0.0.1:6379> HINCRBY person height 5 # 指定key值+5
(integer) 185
127.0.0.1:6379> HINCRBY person height -2 # 指定key值-2
(integer) 183
127.0.0.1:6379> HSETNX person name ls # 如果不存在则创建
(integer) 0
127.0.0.1:6379> HSETNX person age 20 # 如果存在就不再创建
(integer) 1
hash变更数据 user name age, 尤其是用户信息之类经常变动的信息! hash更适合于对象的存储,String更适合字符串存储
Zset(有序集合)
在set的基础上增加了一个值,set k1 v1, zset k1 score1 v1
127.0.0.1:6379> ZADD myset 1 one # 添加一个值
(integer) 1
127.0.0.1:6379> ZADD myset 2 two 3 three # 添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1 # 遍历
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> ZADD salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> ZADD salary 5000 zhangsan 500 kuangshen
(integer) 2
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 排序从小到大 -inf 负无穷 +inf 正无穷 限制范围
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500
1) "kuangshen"
2) "xiaohong"
4) 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf withscores # 倒序排列
1) "zhangsan"
2) "5000"
3) "xiaohong"
4) "2500"
5) "kuangshen"
6) "500"
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZREM salary xiaohong # 删除xiaohong
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "zhangsan"
127.0.0.1:6379> ZCARD salary # 获取集合中的个数
(integer) 2
127.0.0.1:6379> ZCOUNT salary 200 1000 # 指定区间内元素个数
(integer) 1
set排序 存储班级成绩,恭喜表排序!
加权排序
三种特殊数据类型
geospatial 地理位置
朋友定位,附近的人,打车距离计算
GEOADD key longitude latitude member [longitude latitude member ...]
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
### GEOADD
127.0.0.1:6379> GEOADD china:city 117.40649689648436 40.29361228193133 beijing # 添加经纬度
(integer) 1
127.0.0.1:6379> GEOADD china:city 116.75199 36.55358 jinan
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.48941 31.40527 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.88308 22.55329 shenzhen
(integer) 1
127.0.0.1:6379> GEOADD china:city 120.21201 30.2084 hangzhou
(integer) 1
### GEOPOS
127.0.0.1:6379> GEOPOS china:city beijing shanghai hangzhou # 获取指定城市的经纬度
1) 1) "117.40649789571762085"
2) "40.2936118710623461"
2) 1) "121.48941010236740112"
2) "31.40526993848380499"
3) 1) "120.21200805902481079"
2) "30.20839995425554747"
GEODIST key member1 member2 [unit]
两位置之间距离!
单位:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
127.0.0.1:6379> GEODIST china:city beijing shanghai # 查看北京到上海的直线距离
"1054581.2477"
127.0.0.1:6379> GEODIST china:city beijing shanghai km
"1054.5812"
127.0.0.1:6379> GEODIST china:city beijing hangzhou km
"1150.1371"
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 查看以(110, 30)为中心半径1000km的位置
1) "shenzhen"
2) "hangzhou"
3) "jinan"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord # 显示经纬度
1) 1) "shenzhen"
2) 1) "113.88307839632034302"
2) "22.55329111565713873"
2) 1) "hangzhou"
2) 1) "120.21200805902481079"
2) "30.20839995425554747"
3) 1) "jinan"
2) 1) "116.75199061632156372"
2) "36.55358010603453778"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord COUNT 2 # 查看以(110, 30)为中心半径1000km的位置 显示经纬度并且 只显示最近的两个地方
1) 1) "shenzhen"
2) 1) "113.88307839632034302"
2) "22.55329111565713873"
2) 1) "jinan"
2) 1) "116.75199061632156372"
2) "36.55358010603453778"
GEORADIUS key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
以给定的位置为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "jinan"
2) "beijing"
GEO 底层的实现原理其实就是Zset!可以使用Zset命令来操作GEO
127.0.0.1:6379> ZREM china:city beijing # 删除位置
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "hangzhou"
3) "shanghai"
4) "jinan"

浙公网安备 33010602011771号