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"
posted @ 2021-04-04 15:32  王^.^令  阅读(68)  评论(0)    收藏  举报