redis入门(一)

1. Redis概述

1.1 什么是nosql

定义:nosql又叫做非关系型数据库,与传统关系型数据库(如Mysql)不同,它们通常依赖非规范化数据,以便提高数据检索速度,提供数据库的并发执行效率。

存储类型:键值对存储数据(Redis)、文档性数据库(MongoDB)、列存储数据库( HBase )、 图关系数据库 ( Neo4j,InfoGrid )。这些数据库不需要固定的模式、无需多余操作即可横向扩展。

1.2 Redis入门

基本数据类型:String、List、Hash、Set、Zset(有序集合)五种基本数据类型。

数据库:redis一共有16个数据库(0 到 15),默认选择的是0号数据库,可以使用select命令进行数据库切换。

性能指标:redis是基于c语言编写的,官方测试的QPS是10万+。

为什么快:redis是基于内存操作的,数据基本存储在内存中,CPU不是redis的性能瓶颈,redis的瓶颈是与内存和网络带宽正相关的。而且redis是单线程操作的。

单线程为什么还能支持高并发:redis的数据基本存储在内存当中,所以使用单线程是效率最高的,多线程操作会增加CPU上下文的切换(非常耗时),对于内存系统来说,没有CPU上下文的切换就是效率最高的。

2. 五大基础数据

2.1 redis key命令
本机redis_01:0>set name1 zhangsan 
"OK"
本机redis_01:0>set name2 lisi
"OK"
本机redis_01:0>set age1 23
"OK"
本机redis_01:0>set age2 45
"OK"
本机redis_01:0>keys *   # 查找所有符合给定模式( pattern)的 key 。
 1)  "age2"
 2)  "age1"
 3)  "name1"
 4)  "name2"
本机redis_01:0>keys name*
 1)  "name1"
 2)  "name2"
本机redis_01:0>keys age*
 1)  "age2"
 2)  "age1"
本机redis_01:0>rename name1 name  # 修改 key 的名称
"OK"
本机redis_01:0>keys n*
 1)  "name"
 2)  "name2"
本机redis_01:0>move name 1  # 将当前数据库的 key 移动到给定的数据库 db 当中。
"1"
本机redis_01:0>select 1
"OK"
本机redis_01:1>get name
"zhangsan"
本机redis_01:0>expire name 10  # seconds 为给定 key 设置过期时间。
"1"
本机redis_01:0>ttl name   # 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
"7"
本机redis_01:0>ttl name  
"4"
本机redis_01:0>ttl name
"0"
本机redis_01:0>ttl name
"-2"
本机redis_01:0>get name
null
本机redis_01:0>set name lisi
"OK"
本机redis_01:0>get name 
"lisi"
本机redis_01:0>del name   # 该命令用于在 key 存在是删除 key。
"1"
本机redis_01:0>get name
null
本机redis_01:0>set name 123zhangsan
"OK"
本机redis_01:0>expire name 100
"1"
本机redis_01:0>pttl name  # 以毫秒为单位返回 key 的剩余的过期时间。
"94515"
本机redis_01:0>renamenx name nme  # 仅当 newkey 不存在时,将 key 改名为 newkey 。
"1"
本机redis_01:0>exists age2 # 判断key是否在当前数据库中存在
"1"
本机redis_01:0>exists age1
"1"
本机redis_01:0>flushdb # 清空当前数据库
"OK"
本机redis_01:0>keys * 
本机redis_01:0>flushall # 清空所有数据库(16个)数据
2.2 String(字符串)
  • 作用:分布式锁、阅读量/关注量增加或者减少、缓存
本机redis_01:0>set name zhangsan  # 设置字符串
"OK"
本机redis_01:0>get name  # 获取字符串
"zhangsan"
本机redis_01:0>setnx name lisi  # 只有在 key 不存在时设置 key 的值。
"0"
本机redis_01:0>get name 
"zhangsan"
本机redis_01:0>mset age 24 gold 45   # 同时设置一个或多个 key-value 对。
"OK"
本机redis_01:0>keys *
 1)  "age"
 2)  "name"
 3)  "gold"
本机redis_01:0>get age
"24"
本机redis_01:0>get gold
"45"
本机redis_01:0>incr gold  # 将 key 中储存的数字值增一。
"46"
本机redis_01:0>decr gold  # 将 key 中储存的数字值减一。
"45"
本机redis_01:0>incrby gold 10 # 将 key 所储存的值加上给定的增量值(increment) 。
"55"
本机redis_01:0>decrby gold 5 # key 所储存的值减去给定的减量值(decrement) 。
"50"
本机redis_01:0>append name 666 # 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果不存在就是set一个新的字符串
"11"
本机redis_01:0>get name
"zhangsan666"
本机redis_01:0>setex user 100 lisiyyds # 设置key并给key设置过期时间,单位秒
"OK"
本机redis_01:0>mget age gold # 获取所有(一个或多个)给定 key 的值。
 1)  "24"
 2)  "50"
本机redis_01:0>getrange user 0 -1 # 按照字符下标返回 key 中字符串值的子字符
"lisiyyds"
本机redis_01:0>getrange user 1 3
"isi"
本机redis_01:0>getset user zhangsan1234456677 # 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
"lisiyyds"
本机redis_01:0>get user
"zhangsan1234456677"
2.3 List(列表)
  • 作用:可以支持栈、堆、队列、数组等数据结构。常用的业务场景包括购物车、业务排序列表等
本机redis_01:0>lpush list 1  # 将一个或多个值插入到列表头部,从左往右插入
"1"
本机redis_01:0>lpush list 2
"2"
本机redis_01:0>lpush list 3
"3"
本机redis_01:0>lrange list 0 -1 # 获取列表指定范围内的元素,从右往左读取
 1)  "3"
 2)  "2"
 3)  "1"
本机redis_01:0>rpush list a # 在列表中添加一个或多个值,从右往左插入
"4"
本机redis_01:0>rpush list b
"5"
本机redis_01:0>lrange list 0 -1
 1)  "3"
 2)  "2"
 3)  "1"
 4)  "a"
 5)  "b"
 本机redis_01:0>llen list  # 获取列表长度
"5"
本机redis_01:0>lpop list # 移除并获取列表的第一个元素
"3"
本机redis_01:0>rpop list # 移除并获取列表最后一个元素
"b"
本机redis_01:0>lindex list 2 # 通过索引获取列表中的元素
"a"
本机redis_01:0>lpushx list q #将一个或多个值插入到已存在的列表头部!如果列表不存在则不进行插入操作!
"5"
本机redis_01:0>lpushx list w
"6"
本机redis_01:0>lpushx list ty 
"7"
本机redis_01:0>lrange list 0 -1
 1)  "ty"
 2)  "w"
 3)  "q"
 4)  "r"
 5)  "2"
 6)  "1"
 7)  "a"
本机redis_01:0>rpushx list zx  # 可以同时插入多个列表将一个或多个值插入到已存在的列表尾部!
"8"
本机redis_01:0>rpushx list vb
"9"
本机redis_01:0>lrange list 0 -1
 1)  "ty"
 2)  "w"
 3)  "q"
 4)  "r"
 5)  "2"
 6)  "1"
 7)  "a"
 8)  "zx"
 9)  "vb"
 本机redis_01:0>lset list 1 zhangsan # 通过索引设置列表元素的值
"OK"
本机redis_01:0>lrange list 0 -1
 1)  "ty"
 2)  "zhangsan"
 3)  "q"
 4)  "r"
 5)  "2"
 6)  "1"
 7)  "a"
 8)  "zx"
 9)  "vb"
 本机redis_01:0>ltrim list 0 4 # 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
"OK"
本机redis_01:0>lrange list 0 -1
 1)  "ty"
 2)  "zhangsan"
 3)  "q"
 4)  "r"
 5)  "2"
 本机redis_01:0>lrem list 2 zhangsan  # Redis Lrem 根据参数 COUNT(这里count等于2) 的值,移除列表中与参数 VALUE 相等的元素。count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。count = 0 : 移除表中所有与 VALUE 相等的值。
"1"
本机redis_01:0>lrange list 0 -1
 1)  "ty"
 2)  "q"
 3)  "r"
 4)  "2"
 本机redis_01:0>linsert list before ty one  # 在列表的元素前或者后插入元素
"5"
本机redis_01:0>lrange list 0 -1
 1)  "one"
 2)  "ty"
 3)  "q"
 4)  "r"
 5)  "2"
本机redis_01:0>linsert list after ty two
"6"
本机redis_01:0>lrange list 0 -1
 1)  "one"
 2)  "ty"
 3)  "two"
 4)  "q"
 5)  "r"
 6)  "2"
2.4 set(集合)
  • set是无序不能重复集合
本机redis_01:0>sadd set01 one    # set集合添加一个元素
"1"
本机redis_01:0>sadd set01 two
"1"
本机redis_01:0>sadd set01 three
"1"
本机redis_01:0>sadd set01 hello
"1"
本机redis_01:0>scard set01   # 获取集合大小
"4"
本机redis_01:0>smembers set01  # 返回集合中的所有成员
 1)  "two"
 2)  "hello"
 3)  "three"
 4)  "one"
本机redis_01:0>sismember set01 hello  # 判断 member 元素是否是集合 key 的成员
"1"
本机redis_01:0>sismember set01 lisi 
"0"
本机redis_01:0>srem set01 one # 移除集合中一个或多个成员
"1"
本机redis_01:0>smembers set01 
 1)  "two"
 2)  "hello"
 3)  "three"
 本机redis_01:0>sadd set02 zhangsan
"1"
本机redis_01:0>sadd set02 lisi
"1"
本机redis_01:0>sadd set02 hello
"1"
本机redis_01:0>smembers set02
 1)  "lisi"
 2)  "hello"
 3)  "zhangsan" 
 本机redis_01:0>sunion set01 set02   # 返回所有给定集合的并集
 1)  "hello" 
 2)  "three"
 3)  "two"
 4)  "lisi"
 5)  "zhangsan"
本机redis_01:0>sinter set01 set02 # 返回给定所有集合的交集
 1)  "hello"
本机redis_01:0>sdiff set01 set02 # 返回给定所有集合的差集
 1)  "two"
 2)  "three"
本机redis_01:0>sadd user1 zhangsan
"1"
本机redis_01:0>sadd user2 lisi
"1"
本机redis_01:0>sadd user1 xiaowei
"1"
本机redis_01:0>sadd user2 xiaofang
"1"
本机redis_01:0>sadd user2 xiaowei
"1"
本机redis_01:0>sunionstore user4 user1 user2
"4"
本机redis_01:0>smembers user4 # 将给定集合的并集存储在指定的集合 destination 中。
 1)  "xiaofang"
 2)  "lisi"
 3)  "xiaowei"
 4)  "zhangsan"
本机redis_01:0>sinterstore user5 user1 user2 # 将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖
"1"
本机redis_01:0>smembers user5
 1)  "xiaowei"
本机redis_01:0>sdiffstore user6 user1 user2 # 将给定集合之间的差集(一般是user1的差集)存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。
"1"
本机redis_01:0>smembers user6
 1)  "zhangsan" 
本机redis_01:0>srandmember user2 # 返回集合中一个或多个随机数
"xiaofang"
本机redis_01:0>srandmember user2 2
 1)  "lisi"
 2)  "xiaowei"
本机redis_01:0>spop user2 # 移除并返回集合中的一个随机元素
"xiaofang"
本机redis_01:0>spop user2
"lisi"
本机redis_01:0>smembers user2
 1)  "xiaowei"
2.5 zset(有序集合)
  • 作用:成绩榜排名、工资排行表、topN排行榜、权重消息排行等业务
本机redis_01:0>zadd gold 30 zhangsan # 向有序集合添加一个或多个成员,或者更新已存在成员的分数
"1"
本机redis_01:0>zadd gold 50 lisi
"1"
本机redis_01:0>zadd gold 70 xiaoli 
"1"
本机redis_01:0>zadd gold 99 xiaofang 
"1"
本机redis_01:0>zadd gold 58 xiaowei 
"1"
本机redis_01:0>zrange gold 0 -1 # 通过索引区间返回有序集合成指定区间内的成员,升序
 1)  "zhangsan"
 2)  "lisi"
 3)  "xiaowei"
 4)  "xiaoli"
 5)  "xiaofang"
 本机redis_01:0>zrange gold 0 -1 withscores # 返回结果加上score
 1)  "zhangsan"
 2)  "30"
 3)  "lisi"
 4)  "50"
 5)  "xiaowei"
 6)  "58"
 7)  "xiaoli"
 8)  "70"
 9)  "xiaofang"
 10)  "99"
本机redis_01:0>zrangebyscore gold 50 100 # 通过分数区间返回有序集合指定区间内的成员
 1)  "lisi"
 2)  "xiaowei"
 3)  "xiaoli"
 4)  "xiaofang"
本机redis_01:0>zrangebyscore gold -inf +inf # 正无穷和负无穷区间
 1)  "zhangsan"
 2)  "lisi"
 3)  "xiaowei"
 4)  "xiaoli"
 5)  "xiaofang"
 本机redis_01:0>zrangebyscore gold -inf +inf withscores
 1)  "zhangsan"
 2)  "30"
 3)  "lisi"
 4)  "50"
 5)  "xiaowei"
 6)  "58"
 7)  "xiaoli"
 8)  "70"
 9)  "xiaofang"
 10)  "99"
 本机redis_01:0>zrevrange gold 0 -1 withscores # 返回有序集中指定区间内的成员,通过索引,分数从高到底;降序排列
 1)  "xiaofang"
 2)  "99"
 3)  "xiaoli"
 4)  "70"
 5)  "xiaowei"
 6)  "58"
 7)  "lisi"
 8)  "50"
 9)  "zhangsan"
 10)  "30"
 本机redis_01:0>zrevrangebyscore gold 100 50 # 通过分数区间查询区间内的成员,降序查询
 1)  "xiaofang"
 2)  "xiaoli"
 3)  "xiaowei"
 4)  "lisi"
本机redis_01:0>zrevrangebyscore gold 100 50 withscores
 1)  "xiaofang"
 2)  "99"
 3)  "xiaoli"
 4)  "70"
 5)  "xiaowei"
 6)  "58"
 7)  "lisi"
 8)  "50"
 本机redis_01:0>zcount gold 0 100 # 查询指定分数区间内的元素个数
"5"
本机redis_01:0>zcard gold  # 查询整个列表的大小
"5"
本机redis_01:0>zrank gold zhangsan # 查询指定元素的排序序号,升序
"0"
本机redis_01:0>zrevrank gold zhangsan # 查询指定元素的排序序号,降序
"4"
本机redis_01:0>zscore gold zhangsan # 返回有序集中,成员的分数值
"30"
本机redis_01:0>zincrby gold 10 zhangsan # 有序集合中对指定成员的分数加上增量 increment
"40"
本机redis_01:0>zrange gold 0 -1
 1)  "zhangsan"
 2)  "lisi"
 3)  "xiaowei"
 4)  "xiaoli"
 5)  "xiaofang"
本机redis_01:0>zincrby gold 40 zhangsan
"80"
本机redis_01:0>zrange gold 0 -1
 1)  "lisi"
 2)  "xiaowei"
 3)  "xiaoli"
 4)  "zhangsan"
 5)  "xiaofang"
 本机redis_01:0>zlexcount gold - +
"5"
本机redis_01:0>zrem gold zhangsan
"1"
本机redis_01:0>zrange gold 0 -1  #删除元素
 1)  "lisi"
 2)  "xiaowei"
 3)  "xiaoli"
 4)  "xiaofang"
 
 # 其它看官方文档:并集、交集、还有按照字典区间进行排序删除等操作API
2.6 hash(哈希)
  • 作用:适合存储用户信息等经常会更改的信息,hash更适合存储java里面的对象,string适合存储字符串
本机redis_01:0>hset myhash name zhangsan  # 将哈希表 key 中的字段 field 的值设为 value 
"1"
本机redis_01:0>hmset myhash age 30 gender 男 host 广东 nick 靓仔 # 同时将多个 field-value (域-值)对设置到哈希表 key 中
"OK"
本机redis_01:0>hget myhash name # 获取存储在哈希表中指定字段的值
"zhangsan"
本机redis_01:0>hmget myhash name age gender # 批量获取所有给定字段的值
 1)  "zhangsan"
 2)  "30"
 3)  "男"
本机redis_01:0>hgetall myhash # 获取在哈希表中指定 key 的所有字段和值
 1)  "name"
 2)  "zhangsan"
 3)  "age"
 4)  "30"
 5)  "gender"
 6)  "男"
 7)  "host"
 8)  "广东"
 9)  "nick"
 10)  "靓仔"
 本机redis_01:0>hexists myhash name # 查看哈希表 key 中,指定的字段是否存在。
"1"
本机redis_01:0>hexists myhash age
"1"
本机redis_01:0>hexists myhash gold
"0"
本机redis_01:0>hlen myhash  # 获取哈希表中字段的数量
"5"
本机redis_01:0>hkeys myhash # 获取所有哈希表中的字段
 1)  "name"
 2)  "age"
 3)  "gender"
 4)  "host"
 5)  "nick"
本机redis_01:0>hvals myhash # 获取哈希表中所有值
 1)  "zhangsan"
 2)  "30"
 3)  "男"
 4)  "广东"
 5)  "靓仔"
 本机redis_01:0>hsetnx myhash gold 50  # 只有在字段 field 不存在时,设置哈希表字段的值。
"1"
本机redis_01:0>hsetnx myhash name lis
"0"
本机redis_01:0>hincrby myhash gold 10 # 为哈希表 key 中的指定字段的整数值加上增量 increment 。
"60"
本机redis_01:0>hincrby myhash gold 1
"61"
本机redis_01:0>hincrby myhash gold -10
"51"
本机redis_01:0>hdel myhash name # 删除一个或多个哈希表字段
"1"
本机redis_01:0>hkeys myhash 
 1)  "age"
 2)  "gender"
 3)  "host"
 4)  "nick"
 5)  "gold"

3. 种特殊数据

3.1 geo(地理位置)
  • 应用:朋友圈、附近的人、打车距离位置等业务;主要是redis3.2版本之后退出的

  • 数据结构:主要存储用户/地点的经纬度进行直线距离换算

  • 注意:有效的经度是-180到180度;有效的纬度是 -85.05112878度到85.05112878度

  • 朋友圈功能:以每一个用户的唯一ID作为地址名称,在用户打开位置共享时将其经纬度(数据来源一般来源于第三方接口或java sdk)插入geo数据中。然后使用 GEORADIUS命令查询符合查询半径内的在线用户。

    本机redis_01:0>geoadd chain:area 116.40 39.30 beijing 114.52 38.05 shijiazhuang 
    # 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
    "2"
    本机redis_01:0>geoadd chain:area 115.85 28.68 nanchang 112.93 28.23 changsha
    "2"
    本机redis_01:0>geopos chain:area beijing changsha
    # 从key里返回所有给定位置元素的位置(经度和纬度)
     1)    1)   "116.39999896287918"
      2)   "39.300001176601477"
    
     2)    1)   "112.9299983382225"
      2)   "28.22999939496831"
    
    本机redis_01:0>geodist chain:area beijing changsha # 返回两个给定位置之间的距离,会有0.5%的误差,单位支持M(默认是米)、KM(公里)、MI(英里)、FT(英尺)
    "1272094.8377"
    本机redis_01:0>geodist chain:area beijing changsha km
    "1272.0948"
    
    本机redis_01:0>georadius chain:area 116 38 200 km # 以给定的经纬度为中心, 找出某一半径内的元素
     1)  "shijiazhuang"
     2)  "beijing"
    本机redis_01:0>georadiusbymember chain:area beijing 300 km
    # 找出位于指定范围内的元素,中心点是由给定的位置元素决定
     1)  "shijiazhuang"
     2)  "beijing" 
    
3.2 hyperloglog(基数统计)
  • 什么是基数统计:即一个集合中不重复的字符数量,如{1,3,5,7,9,7}的基数就是4
  • 作用:可以统计阅读量,因为hyperloglog主要是基于zset开发的,所以它也可以使用zset命令进行操作。hyperloglog最大只占内存的12K,所以非常适合用于计数操作,如阅读人数等。
  • 场景:适用于支持容错的场景,即数据量很大时有一定的误差,如果业务要求严格不支持容错,则推荐使用set或者zset
本机redis_01:0>pfadd read1 a b c d a # 添加指定元素到 HyperLogLog 中。
"1"
本机redis_01:0>pfcount read1 # 返回给定 HyperLogLog 的基数估算值。
"4"
本机redis_01:0>pfadd read2 f g a c v n m 
"1"
本机redis_01:0>pfcount read2
"7"
本机redis_01:0>pfcount read1 read2 # pfcount也可以统计两个集合合并的基数
"9"
本机redis_01:0>pfmerge read3 read1 read2 # 将多个 HyperLogLog 合并为一个 HyperLogLog
"OK"
本机redis_01:0>pfcount read3
"9"
3.3 bitmap(位图场景)
  • 存储的元素值只有两种状态0、1;适合用于只有正反的业务,如用户打卡记录、每日任务、每日签到等
本机redis_01:0>setbit sign 0 1 # 设置bit
"0"
本机redis_01:0>setbit sign 1 0
"0"
本机redis_01:0>setbit sign 2 1
"0"
本机redis_01:0>setbit sign 3 1
"0"
本机redis_01:0>setbit sign 4 1
"0"
本机redis_01:0>setbit sign 5 0
"0"
本机redis_01:0>setbit sign 6 0 
"0"
本机redis_01:0>getbit sign 6  # 获取bit值
"0"
本机redis_01:0>getbit sign 4
"1"
本机redis_01:0>bitcount sign  # 统计bit正值数量
"4"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值