Redis特点、安装和数据库相关指令
NoSQL
NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出, 发展至2009年趋势越发高涨。
- RDBMS: 关系型数据库 sql语句
- NoSQL Not Only Sql 不仅仅是sql: 泛指非关系数据库
随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。
如商城网站中对商品数据频繁查询、对热搜商品的排行统计、订单超时问题、以及微信朋友圈(音频,视频)存储等相关使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是在性能上却不是那么乐观。
nosql这个技术门类的出现,更好的解决了这些问题,它告诉了世界不仅仅是sql。
NoSQL的四大分类
键值(Key-Value)存储数据库
- 说明:
- 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
Map<key,value>
- 特点
- Key/value模型对于IT系统来说的优势在于简单、易部署。
但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。因为要先对整体进行遍历
- 相关产品
- Tokyo Cabinet/Tyrant,
- Redis
key value内存 快 运行软件 ---> 磁盘---> 内存--->操作 - SSDB
key value硬盘---> 内存 - Voldemort
- Oracle BDB
列存储数据库
- 说明
- 这部分数据库通常是用来应对分布式存储的海量数据。
- 特点
- 键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
key rouingkey 设计
- 相关产品
- Cassandra、HBase、Riak.
文档型数据库(document)
- 说明
- 文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
{"id":"21", "name":"张三", "age":"23" ,"tags":["帅哥","学霸"],"clazz":{"id":"21"}} ---> document
{"id":"21", "name":"xxx"} BSON
- 特点
- 以文档形式存储
- 相关产品
MongoDB、CouchDB、MongoDb(4.x). 国内也有文档型数据库SequoiaDB,已经开源。
图形(Graph)数据库
- 说明
- 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。
- NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。
- 特点
- 相关产品
- Neo4J、
InfoGrid、 Infinite Graph、
NoSQL应用场景
- 数据模型比较简单
- 需要灵活性更强的IT系统(系统设计灵活 性能要求比较高)
- 对数据库性能要求较高
- 不需要高度的数据一致性(Nosql产品对于事务支持都不是特别良好)
什么是Redis
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
Redis 开源 遵循BSD 基于内存数据存储 被用于作为数据库缓存、消息中间件
Redis 数据内存中 内存:读写快 断电立即消失
机制:持久化机制 内存数据 定期写入到磁盘中
- 总结: redis是一个
内存型的数据库
内存 ram: 读写快
硬盘 rom: 数据持久化
数据库: 硬盘存储 --->内存--->操作
Redis特点
- Redis是一个高性能key/value内存型数据库
- Redis支持丰富的数据类型
(Memcache "字符串" Object) String,List,Set,ZSet,Hash) - Redis支持持久化
内存数据 持久化到硬盘中 - Redis单线程,单进程
(线程安全 Redis分布式锁)Memechache key value 多线程
Redis实现分布式锁 java 多线程 Synchronized jvm ---> java 多线程 Synchronized jvm ---> java 多线程
Redis安装
准备环境
- vmware15.x+
- centos7.x+
下载redis源码包
-
下载完整源码包
- redis-4.0.10.tar.gz
-
将下载redis资料包上传到Linux中
-
解压缩文件
tar -zxvf xxx
-
安装gcc
- yum install -y gcc
- 进入解压缩目录执行如下命令
- make MALLOC=libc
- 编译完成后执行如下命令
- make install PREFIX=/usr/redis
- 进入/usr/redis/bin目录启动redis服务
- ./redis-server
-
Redis服务端口默认是 6379
-
进入bin目录执行客户端连接操作
- ./redis-cli –p 6379
cd /usr/redis/bin/
./redis-cli -h localhost -p 6379
- 连接成功出现上面界面连接成功
redis细节
1. redis启动服务的细节
注意: 直接使用./redis-server方式启动使用的是redis-server这个shell脚本中默认配置
2. 如何在启动redis时指定配置文件启动
注意: 默认在redis安装完成之后在安装目录没有任何配置文件, 需要在源码目录中复制redis.conf配置文件到安装目录
- 进入源码目录
cp redis.conf /usr/redis/ - 进入/usr/redis安装目录查看复制配置文件
cd /usr/redis
ls - 进入bin目录加载配置启动
./redis-server ../redis.conf
3. 修改redis默认端口号
vim ../redis.conf
想要配置修改生效,配置启动 ./redis-server ../redis.conf
连接redis
./redis-cli -p 7000
4. Redis中库的概念
- 库:database 用来存放数据一个基本单元 一个库可以存放key-value键值对,redis中每一个库都有一个唯一名称|编号从0开始
- 默认库的个数: 16个库 库的编号: 0-15,默认使用0号库
- 切换库命令: select dbid(库编号)
库的编号最大是15
修改库的编号
5. redis中清除库的指令
flushDB 清空当前库
flushAll 清空所有库
6. redis客户端显示中文
- ./redis-cli -p 7000 --raw
Redis数据库相关指令
1. 操作key相关指令
DEL指令
- 语法 : DEL key [key ...]
- 作用 : 删除给定的一个或多个 key 。不存在的key会被忽略。
- 可用版本: >= 1.0.0
- 返回值: 被删除key 的数量。
- 测试
EXISTS指令
- 语法: EXISTS key
- 作用: 检查给定key 是否存在。
- 可用版本: >= 1.0.0
- 返回值: 若key 存在,返回1 ,否则返回0。
EXPIRE
- 语法: EXPIRE key seconds
- 作用: 为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
- 可用版本: >= 1.0.0
- 时间复杂度: O(1)
- 返回值:设置成功返回1 。
KEYS
- 语法 : KEYS pattern
- 作用 : 查找所有符合给定模式 pattern 的key 。
- 语法:
KEYS * 匹配数据库中所有key 。
KEYS h?llo 匹配hello ,hallo 和hxllo 等。
KEYS h*llo 匹配hllo 和heeeeello 等。
KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。特殊符号用\隔开 - 可用版本: >= 1.0.0
- 返回值: 符合给定模式的key 列表。
- 测试
KEYS * 可以匹配0到任意多个字符
KEYS h? 只能严格匹配1个任意字符
KEYS h[ae]llo 匹配hello 和hallo,中括号也只能匹配1个
KEYS h[ae][ae]llo,中括号能匹配2个,必须满足长度是6位
MOVE
- 语法 : MOVE key db
- 作用 : 将当前数据库的key 移动到给定的数据库db 当中。
- 可用版本: >= 1.0.0
- 返回值: 移动成功返回1 ,失败则返回0 。
PEXPIRE
- 语法 : PEXPIRE key milliseconds
- 作用 : 这个命令和EXPIRE 命令的作用类似,但是它以毫秒为单位设置key 的生存时间,而不像EXPIRE 命令那样,以秒为单位。
- 可用版本: >= 2.6.0
- 时间复杂度: O(1)
- 返回值:设置成功,返回1 key 不存在或设置失败,返回0
PEXPIREAT
- 语法 : PEXPIREAT key milliseconds-timestamp
- 作用 : 这个命令和EXPIREAT 命令类似,但它以毫秒为单位设置key 的过期unix 时间戳,而不是像EXPIREAT那样,以秒为单位。
- 可用版本: >= 2.6.0
- 返回值:如果生存时间设置成功,返回1 。当key 不存在或没办法设置生存时间时,返回0 。(查看EXPIRE 命令获取更多信息)
TTL
- 语法 : TTL key
- 作用 : 以秒为单位,返回给定key 的剩余生存时间(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值: 当key 不存在时,返回-2 。 当key 存在但没有设置剩余生存时间时,返回-1 。 否则,以秒为单位,返回key 的剩余生存时间。
- Note : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。
PTTL
- 语法 : PTTL key
- 作用 : 这个命令类似于TTL 命令,但它以毫秒为单位返回key 的剩余生存时间,而不是像TTL 命令那样,以秒为单位。
- 可用版本: >= 2.6.0
- 返回值: 当key 不存在时,返回-2 。当key 存在但没有设置剩余生存时间时,返回-1 。
- 否则,以毫秒为单位,返回key 的剩余生存时间。
- 注意 : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。
RANDOMKEY
- 语法 : RANDOMKEY
- 作用 : 从当前数据库中随机返回(不删除) 一个key 。
- 可用版本: >= 1.0.0
- 返回值:当数据库不为空时,返回一个key 。当数据库为空时,返回nil 。
RENAME
- 语法 : RENAME key newkey
- 作用 : 将key 改名为newkey 。当key 和newkey 相同,或者key 不存在时,返回一个错误。当newkey 已经存在时,RENAME 命令将覆盖旧值。
- 可用版本: >= 1.0.0
- 返回值: 改名成功时提示OK ,失败时候返回一个错误。
TYPE
- 语法 : TYPE key
- 作用 : 返回key 所储存的值的类型。
- 可用版本: >= 1.0.0
- 返回值:
none (key 不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
2. String类型
1. 内存存储模型
2. 常用操作命令
3. 测试
strlen
append
getrange
-1是直接到末尾
setex age 超时时间 值
psetex
setnx
msetnx 只要有一个存在,所有的都不会添加
decr
decrby
Incr
incrby
incrbyfloat
重启redis
ps aux|grep redis
redis是支持持久化的
4. List类型
list 列表 相当于java中list 集合 特点 元素有序 且 可以重复
1. 内存存储模型
在redis中不仅可以往左边放元素,还可以往右边放元素
2. 常用操作指令
3. 测试
type
lpush
lrange
rpush
lpushx 不能创建列表,只能对已经存在的列表做操作(从左边添加)
rpushx 不能创建列表,只能对已经存在的列表做操作(从右边添加)
lpop从左边依次弹出(移除)
rpop
llen
lset
lindex
lrem
ltrim
linsert before
linsert after
5. Set类型
特点: Set类型 Set集合 元素无序 不可以重复
1. 内存存储模型
2. 常用命令
3. 测试
sadd
sdiff sets1 sets2 以sets1为基础
smembers
sinter
sunion 求并集
6. ZSet类型
特点: 可排序的set集合 排序 不可重复
ZSET 官方 可排序SET sortSet
1. 内存模型
2. 常用命令
3. 测试
zadd
zrange
zrangebyscore
zrank
zrevrank
zscore
zrem
zincrby
7. hash类型
特点: value 是一个map结构 存在key value ,key 无序的
1. 内存模型
2. 常用命令
3. 测试
hset
hget
hgetall
hdel
hmset
hmget
hsetnx
hincrby
hincrybyfloat
引用 编程不良人