问题现象
罪魁祸首——关系型数据库
- 性能瓶颈:磁盘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的设置约定
表名 : 主键名 : 主键值 : 字段名
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的扩展操作(时效性控制)
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
- 获取key有效时间 ttl key 、pttl key
- 切换key从时效性转换成永久性 persist key
key的扩展操作(查询模式)
查询模式规则: * 匹配任意数量的任意符号 ? 匹配一个任意符号 [] 匹配一个指定符号
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
Jedis jedis = new Jedis("localhost",6379);
jedis.set("name","yiyi");
jedis.get("name");
jedis.close();