当前位置: 首页 > 工具软件 > Redis > 使用案例 >

Redis

颛孙麻雀
2023-12-01

问题现象

  • 海量用户
  • 高并发

罪魁祸首——关系型数据库

  • 性能瓶颈:磁盘IO性能低下
  • 扩展瓶颈:数据关系复杂,扩展性差,不利于大规模集群

解决思路

  • 降低磁盘IO次数,越低越好 —— 内存存储
  • 去除数据间的关系,越简单越好 —— 不存储关系,仅存储数据

NoSql

NoSql:既Not-Only SQL(泛指非关系型的数据库),作为关系型数据库的补充

作用:应对基于海量用户和海量数据前提下的数据处理问题

特征:

  • 可扩容,可伸缩
  • 大数据量下高性能
  • 灵活的数据类型
  • 高可用

常见的NoSql数据库:

  • Redis
  • memcache
  • HBase
  • MongoDB

Redis的基本操作

信息添加

功能:设置key,value数据

命令:set key value

实例:set name zhangsan

信息查询

功能:根据key查询相应的value,如果不存在,返回空(nil)

命令:get key

实例:get name

清除屏幕信息

功能:清除屏幕中的信息

命令:clear

帮助

功能:获取命令帮助文档,获取组中所有命令信息名称

命令:help 命令名称 help @组名

退出客户端命令行模式

功能:推出客户端

命令:quit exit


Redis数据类型

数据存储类型介绍

Redis数据类型(常用5种)

  • string
  • hash
  • list
  • set
  • sorted_set

string

redis数据存储格式

  • redis自身是一个Map,其中所有的数据都是采用key:value的形式存储
  • 数据类型指的是存储的数据的类型,也就是value部分的类型,key永远是字符串

string类型

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

string类型数据的基本操作

  • 添加/修改数据:set key value
  • 获取数据:get key
  • 删除数据:del key
  • 添加/修改多个数据:mset key1 value1 key2 value2 …
  • 获取多个数据:mget key1 key2 …
  • 获取数据字符个数(字符串长度): strlen key
  • 追加信息到原始信息后部(原始信息存在就追加,否则新建):append key value

string类型数据的扩展操作

  • 设置数值数据增加指定范围的值
incr  key    
incrby  key  increment     
incrbyfloat  key  increment   //加减小数
  • 设置数值数据减少指定范围的值
decr  key
decrby  key  increment
  • 设置数据具有指定的生命周期
setex  key  seconds  value
psetex  key  milliseconds  value                 //ex:expire 到期

key的设置约定

  • 数据库中的热点数据key命名惯例

​ 表名 : 主键名 : 主键值 : 字段名

eg1 order : id : 29437595 : name

eg2 equip : id : 39047256 : type

eg3 news : id : 65645675 : title

hash

hash类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的数据结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储

hash类型数据的基本操作

  • 添加/修改数据 hset key field value
  • 获取数据 hget key field 、 hgetall key
  • 删除数据 hdel key field [ field2 ]
  • 添加/修改多个数据 hmset key field1 value1 field2 value2 …
  • 获取多个数据 hmget key field1 field2 …
  • 获取哈希表中字段的数量 hlen key
  • 获取哈希表中是否存在指定的字段 hexists key field

hash类型数据的扩展操作

  • 获取哈希表中所有的字段名或字段值 hkeys key 、 hvals key
  • 设置指定字段的数值数据增加指定范围的值 hincrby key field increment 、 hincrbyfloat key field increment
  • 没有指定的字段就加,有的话不做任何操作 hsetnx key field value

hash类型操作的注意事项

  • 每个hash可以存储232-1个键值对
  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象,若数据未获取到,对应值为(nil)
  • hash类型非常贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可以乱用,更不可以将hash作为对象列表使用
  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

list

list类型

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list类型数据基本操作

  • 添加/修改数据 lpush key value1 [value2] … 、 rpush key value1 [value2] …
  • 获取数据 lrange key start stop 、 lindex key index 、 llen key
  • 获取并移除数据 lpop key 、 rpop key …

list类型数据扩展操作

  • 规定时间内获取并移除数据 blpop key1 [key2] timeout 、 brpop key1 [key2] timeout b:block 阻塞
  • 移除指定数据 lrem key count value rem:remove

list类型数据操作注意事项

  • list种保存的数据都是string类型的,数据总容量是有限的,最多232-1g个元素
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多的信息通过数据库的形式加载

set

set类型

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与哈希的存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

set类型数据基本操作

  • 添加数据 sadd key member1 [member2]
  • 获取全部数据 smembers key
  • 删除数据 srem key [member1] [member2]
  • 获取集合数据总量 scard key
  • 判断集合中是否包含指定数据 sismember key member

set类型数据扩展操作

  • 随机获取集合中指定数量的数据 srandmember key [count]
  • 随机获取集合中的某个数据并将该数据移除集合 spop key
  • 求两个集合的交、并、差集
sinter  key1  [key2]
sunion  key1  [key2]
sdiff   key1  [key2]
  • 求两个集合的交、并、差集并存储到指定的集合中
sinterstore  destination  key1  [key2]
sunionstore  destination  key1  [key2]
sdiffstore   destination  key1  [key2]
  • 将指定数据从原始集合中移动到目标集合中
smove  source  destination  member

set类型数据操作的注意事项

  • set类型不允许重复,如果添加的数据在set中已经存在,将只保存一份
  • set虽然与哈希的存储结构相同,但是无法启用hash中存储值的空间

sorted_set

sorted_set类型

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

sorted_set类型数据的基本操作

  • 添加数据 zadd key score1 member1 [score2 member2]
  • 获取全部数据 zrange key start stop [WITHSCORES] 、 zrevrange key start stop [WITHSOCRES]
  • 删除数据 zrem key member [member …]
  • 按条件获取数据
zrangebyscore  key  min  max  [WITHSCORES]  [LIMIT]                                                                zrangebyscore  key  min  max  [WITHSCORES]  [LIMIT] 
  • 条件删除数据
zremrangebyrank  key  start  stop
zremrangebyscore  key  min  max 
  • 获取集合数据总量 zcard key 、 zcount key min max
  • 集合交、并操作
zinterstore  destination  numkeys  key  [key ...]            //score会相加    可加aggregate取最大或最小
zunionstore  destination  numkeys  key  [key ...]			//score会相加

注意

  • min与max用于限定搜索查询的条件
  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引
  • offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

Redis通用指令

key通用操作

key特征

  • key是一个字符串,通过key获取redis中保存的数据

key基本操作

  • 删除指定key del key
  • 获取key是否存在 exist key
  • 获取key的类型 type key

key的扩展操作(时效性控制)

  • 为指定key设置有效期
expire  key  seconds
pexpire  key  milliseconds
expireat  key  timestamp
pexpireat  key  milliseconds-timestamp
  • 获取key有效时间 ttl key 、pttl key
  • 切换key从时效性转换成永久性 persist key

key的扩展操作(查询模式)

  • 查询key keys pattern

查询模式规则: * 匹配任意数量的任意符号 ? 匹配一个任意符号 [] 匹配一个指定符号

keys  *
keys  it*
keys  *hei
keys  ??hei
keys  user?
keys  u[st]er:1        查询所有以u开头,以er:1结尾,中间包含一个字母s或t

key的其他操作

  • 为key改名 rename key newkey 、renamenx key newkey nx:not exist 如果要改的key存在的话即失败
  • 对所有key排序 sort
  • 其他key通用操作 help @generic

数据库通用操作

数据库

key的重复问题

  • key是由程序员定义的
  • redis在使用过程中,伴随着操作数据量的增加,会出现大量的数据以及对应的key
  • 数据不分种类,类别混杂在一起,极易出现重复或冲突

解决方案

  • redis为每个服务提供有16个数据库,编号从0-15
  • 每个数据库之间的数据相互独立

DB基本操作

  • 切换数据库 select index
  • 数据移动 move key db
  • 数据清除 dbsize 看你库里key数量 、 flushdb 、flush all
  • 其他操作 quit 、 ping 、echo message

Jedis

Jedis简介

编程语言与redis

  • java语言连接redis服务:Jedis 、 lettuce 、SpringData Redis
  • C、C++、C#、Erlang、Lua、PHP、Python、Ruby、Scala等

准备工作

  • jar包引入 地址:https://mvnrepository.com/artifact/redis.clients/jedis
  • 基于maven
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

客户端连接redis

  • 连接redis
Jedis  jedis = new Jedis("localhost",6379);
  • 操作redis
jedis.set("name","yiyi");
jedis.get("name");
  • 关闭redis连接
jedis.close();
 类似资料: