Redis
文章目录
一、NoSQL
1、什么是NoSQL
NoSQL = Not Only SQL(不仅仅是SQL),也解释为 non-relational(非关系型数据库)。在 NoSQL 数据库中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。
2、为什么使用NoSQL
关系型数据库的瓶颈:
- 无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据的是 IO 密集的应用。硬盘 IO 也变为性能瓶颈
- 表中存储记录数量有限,横向可扩展能力有限,一张表最大二百多列。纵向数据可承受能力也是有限的,一张表的数据到达百万级,读写的速度就会逐渐的下降。面对海量数据,必须使用主从复制,分库分表。这样的系统架构是难以维护的。大数据查询 SQL 效率极低,数据量到达一定程度时,查询时间会呈指数级别增长
- 无法简单地通过增加硬件、服务节点来提高系统性能。数据整个存储在一个数据库中的。多个服务器没有很好的解决办法,来复制这些数据
- 关系型数据库大多是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大
3、NoSQL的优势
(1)大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。关系型数据库(例如MySQL)使用查询缓存。这种查询缓存在更新数据后,缓存就是失效了。在频繁的数据读写交互应用中。缓存的性能不 高。NoSQL的缓存性能要高的多。
(2)灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。尤其在快速变化的市场环境中,用户的需求总是在不断变化的。
(3)高可用
NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。
NoSQL能很好的解决关系型数据库扩展性差的问题。弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。
MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者结合使用。让关系数据库关注在关系上,NoSQL关注在存储上。
(4)低成本
这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的 License 成本。
4、NoSQL 的劣势
- 无关系,数据之间是无联系的
- 不支持标准的SQL,没有公认的 NoSQL 标准
- 没有关系型数据库的约束,大多数也没有索引的概念
- 没有事务,不能依靠事务实现 ACID
- 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)
二、Redis安装和使用
Redis是当今非常流行的基于KV 结构的作为 Cache 使用的 NoSQL 数据库
1、Redis介绍
Remote Dictionary Server(Redis)是一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的 Key-Value 数据库。Key 字符类型,其值(value)可以是字符串(String),哈希(Map),列表(list),集合(sets)和有序集合(sorted sets)等类型,每种数据类型有自己的专属命令。所以它通常也被称为数据结构服务器。
Redis 的作者是 Salvatore Sanilippo,来自意大利的西西里岛。现在居住在卡塔尼亚。目前供职于Pivotal 公司(Pivotal 是 Spring 框架的开发团队),Salvatore Sanfilippo 被称为 Redis 之父。
官网:https://redis.io/
中文:http://www.redis.cn/
2、Window安装Redis
Windows 版本的 Redis 是 Microsoft 的开源部门提供的 Redis,这个版本的 Redis 适合开发人员学习使用,生产环境中使用 Linux 系统上的 Redis。
(1)下载
官网:https://redis.io//
windows版本:https://github.com/MSOpenTech/redis/releases
(2)安装
解压压缩包
(3)启动Redis
双击 redis-service.exe,启动 Redis 服务
启动后再双击 redis-cli.exe,打开 redis 客户端
3、Linux安装Redis
(1)下载
https://download.redis.io/releases/
(2)安装
A、上传redis-6.0.4.tar到linux系统。使用Xftp工具
B、解压redis-6.0.4.tar到usr/local目录
C、查看解压后的文件
D、编译Redis文件, Redis是使用c语言编写的,会使用gcc编译器
在解压后的 Redis 目录下执行(cd /usr/local/redis-3.2.9) make 命令。
注意事项:
-
make 命令执行过程中可能报错,根据控制台输出的错误信息进行解决
-
错误一:gcc命令找不到,是由于没有安装gcc导致
解决方式:安装 gcc 编译器后在执行 make 命令
-
什么是 gcc?
gcc 是 GNU compiler collection 的缩写,它是 Linux 下一个编译器集合(相当于javac),是 c 或 C++ 程序的编译器。
-
怎么安装gcc ?
使用 yum 进行安装 gcc。执行命令:yum -y install gcc
-
-
错误二error:jemalloc/jemalloc.h:Nosuch file or directory
解决方式执行:make MALLOC=libc
-
错误三gcc版本过低:
make[1]: *** [server.o] Error 1 make[1]: Leaving directory `/usr/local/redis-6.0.5/src' make: *** [all] Error 2
解决方案:
[root@localhost redis-6.0.5]# gcc -v # 查看gcc版本 [root@localhost redis-6.0.5]# yum -y install centos-release-scl # 升级到9.1版本 [root@localhost redis-6.0.5]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils [root@localhost redis-6.0.5]# scl enable devtoolset-9 bash 以上为临时启用,如果要长期使用gcc 9.1的话: [root@localhost redis-6.0.5]# echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile 之后再次执行make即可
开始执行make
(3)启动Redis
A、后台启动服务器
B、查看服务是否启动
C、启动redis客户端
(4)关闭Redis
关闭方式:
A、使用redis客户端关闭,向服务器发出关闭命令
切换到redis-3.2.9/src/ 目录,执行 ./redis-cli shutdown。推荐使用这种方式,redis 先完成数据操作,然后再关闭。
B、kill pid 或者kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用ps -ef | grep redis查出进程号,在使用kill pid
4、Redis客户端
(1)redis命令行客户端
redis-cli(Redis Command Line Interface)是Redis 自带的基于命令行的Redis 客户端,用于与服务端交互,我们可以使用该客户端来执行 redis 的各种命令。
两种常用的连接方式:
A、直接连接redis(默认ip127.0.0.1,端口6379): ./redis-cli
在redis安装目录\src,执行./redis-cli
此命令是连接本机127.0.0.1,端口6379的 redis
B、指定IP和端口连接redis: ./redis-cli -h 127.0.0.1 -p 6379
- -h:redis主机IP(可以指定任意的 redis 服务器)
- -p:端口号(不同的端口表示不同的 redis 应用)
在 redis 安装目录\src,执行./redis-cli -h 127.0.0.1 ~p 6379
(2)redis远程客户端
Redis Desktop Manager:C++编写,响应迅速,性能好。
- 官网地址:https://redisdesktop.com/
- github:https://github.com/uglide/RedisDesktopManager
- 使用文档:http://docs.redisdesktop.com/en/latest/
A、使用客户端连接Linux的Redis
连接 Linux 的 Reids 之前需要修改 Redis 服务器的配置信息。Redis 服务器有安全保护措施,默认只有本机(安装Redis的那台机器)能够访问。配置信息存放在 Redis 安装目录下的 redis.conf 文件。修改此文件的两个设置。
远程连接 redis 需要修改 redis 主目录下的 redis.conf 配置文件:
- bind ip 绑定 ip 此行注释
- protected-mode yes 保护模式改为no
- 使用 vim 命令修改 redis.conf 文件,修改文件前备份此文件,执行 cp 命令
执行vim redis.conf
保存退出即可。
B、使用redis.conf启动redis-server服务
注意:每次启动 redis,都需要指定 redis.conf 的文件位置,因为 redis 启动不加载 redis.conf 这个文件,而我们修改了这个文件,要让此文件修改的内容生效,必须每次都要指定 redis.conf 的文件位置,否则修改的内容就不起作用了。
C、关闭Linux的防火墙
D、客户端连接
查看客户端显示内容
(3)redis编程客户端
A、Jedis
redis 的 Java编程客户端,Redis 官方首选推荐使用 Jedis,jedis 是一个很小但很健全的 redis 的 java客户端。通过 Jedis 可以像使用Redis 命令行一样使用Redis。
- jedis 完全兼容:redis 2.8.x and 3.x.x
- Jedis 源码:https://github.com/xetorthio/jedis
- api 文档:http://xetorthio.github.io/jedis/
B、redis的其他编程语言客户端
C、C++、C#、Erlang、 Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Go等40多种语言都有连接 redis 的编程客户端。
5、Redis基本操作命令
redis 默认为16个库(在 redis.conf 文件可配置,该文件很重要,后续很多操作都是这个配置文件),redis 默认自动使用0号库。
(1)沟通命令,查看状态
redis > ping 返回 PONG
解释:输入 ping,redis 给我们返回 PONG,表示 redis 服务运行正常
(2)查看当前数据库中key的数目:dbsize
语法:dbsize
作用:返回当前数据库的key的数量
返回值:数字,key 的数量
例:查询当前数据库的 key 的数量
(3)redis默认使用16个库
Redis 默认使用16个库,从0到15。对数据库个数的修改,在 redis. conf 文件中
(4)切换库命令:select db
使用其他数据库,命令是 select index
例:select 5
(5)删除当前库的数据:flushdb
(6)redis自带的客户端退出当前redis连接:exit或quit
6、Redis的Key的操作命令
(1)keys
语法:keys pattern
作用:查找所有符合模式 pattern 的 key。pattern 可以使用通配符。
通配符:
- *:表示 0 - 多个字符,例如:keys * 查询所有的 key
- ?:表示单个字符,例如:wo?d,匹配 word、wood
例1:显示所有的 key
例2:使用 * 表示0或多个字符
(2)exists
语法:exists key [key…]
作用:判断 key 是否存在
返回值:整数,存在 key 返回 1,其他返回 0。使用多个 key,返回存在的 key 的数量。
例1:检查指定 key 是否存在
例2:检查多个 key
(3)expire
语法:expire key seconds
作用:设置 key 的生存时间,超过时间,key 自动删除。单位是秒。
返回值:设置成功返回数字 1,其他情况是 0
例:设置 word 的倒计时是30秒
(4)ttl
语法:ttl key
作用:以秒为单位,返回 key 的剩余生存时间(ttl: time to live)
返回值:
- -1:没有设置 key 的生存时间, key 永不过期
- -2:key不存在
- 数字:key 的剩余时间,秒为单位
例1:设置 word 的过期时间是30,查看剩余时间
例2:查看 word 是否存在
(5)type
语法:type key
作用:查看 key 所存储值的数据类型
返回值:字符串表示的数据类型
- none(key 不存在)
- string (字符串)
- list(列表)
- set(集合)
- zset(有序集)
- hash(哈希表)
例1:查看存储字符串的 key:wood
例2:查看不存在的 key
(6)del
语法:del key [key…]
作用:删除存在的 key,不存在的 key 忽略
返回值:数字,删除的 key 的数量
例:删除指定的 key
7、Redis的5种数据类型
(1)字符串类型 string
字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。
key | value |
---|---|
username | 张三 |
(2)哈希类型 hash
Redis hash是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
key | loginuser |
---|---|
field | value |
uname | 李四 |
times | 5 |
region | 武汉 |
//上面表格相当于以下程序
Map<String, String> data = new HashMap();
data.put("uname","李四");
data.put("times","5");
data . put ("region","武汉");
Map<String,Map<String,string> map = new ...
map.put("loginuser",data); //redis hash类型
(3)列表类型 list
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
key | value |
---|---|
region | 北京 上海 广州 |
(4)集合类型 set
Redis 的 Set 是 string 类型的无序集合,集合成员是唯一的, 即集合中不能出现重复的数据。
key | value |
---|---|
spring | |
framework | mybatis |
springmvc |
(5)有序集合类型 zset(sorted set)
Redis 有序集合 zset 和集合 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。