Redis 非关系型数据库

  • 关系型数据库与非关系型数据库
  • 关系型数据库
  • 非关系型数据库
  • 非关系型数据库产生的背景
  • Redis 简介
  • Redis配置文件中的配置参数
  • Redis 数据库常用命令
  • Redis多数据操作
  • Redis数据类型
  • Redis支持五种数据类型


关系型数据库与非关系型数据库

关系型数据库

  • 一个结构化的数据库,创建在关系模型基础上
  • 一般面向于记录
  • 包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2等

非关系型数据库

  • 除了主流的关系型数据库外的数据库,都认为是非关系型数据库
  • 包括:Redis、MongBD、Hbase、CouhDB等

非关系型数据库产生的背景

  • High performance :对数据库高并发读写需求
  • Huge Storage :对海量数据高校存储与访问需求
  • High Scalability && Availability :对数据库高可扩展性与高可用性需求

Redis 简介

  • Redis 基于内存运行并支持持久化
  • 采用 key-value(键值对) 的存储形式
  • 优势
  • 具有极高的书籍读写速度
  • 支持丰富的数据类型
  • 支持数据的持久化
  • 原子性
  • 支持数据备份

Redis配置文件中的配置参数

  • bind :监听的主机地址
  • port :端口
  • daemonize yes :启动守护进程
  • pidfile :指定PID文件
  • loglevel notice :日志级别
  • logfile :指定日志文件

Redis 数据库常用命令

  • redis-cli 命令行工具 —— 获得帮助(进入到数据库中使用)
help @< group >:获取<group>中的命令列表
help < command >:获取某个命令的帮助
help < tab >:获取可能帮助的主题列表
set :存放命令
get:获取数据
  • key 相关命令
keys        :获取符合规则的键值列表
exists      :判断键值是否存在
del           : 删除当前数据库的指定key
type        :获取key对应的value值类型
rename(覆盖) :对已有的key进行重命名
renamenx(不覆盖) :对已有的key进行重命名
dbsize      :查看当前数据库中key的数目
pexpire    :设置超时时间(失效时间,也就是超过时间自动删除;单位:毫秒)
pttl           :查看剩余时间(-1 为永久不超时)
persist      :取消超时时间(将 key 重新设为 -1)
randomkey :随机返回key

示例:
keys 示例:
20.0.0.102:6379> keys *
1) "name"
2) "long"


exists 示例:
20.0.0.102:6379> keys *
ky1
name
yaya
bye
20.0.0.102:6379> exists yaya bye
2


del 示例:
20.0.0.102:6379> del cr wq zbm opt
4
20.0.0.102:6379> keys *
bye
ky1
look


type 示例:
20.0.0.102:6379> type long
hash
20.0.0.102:6379> type name
string



rename 示例:
20.0.0.102:6379> keys *
name
long
20.0.0.102:6379> rename name gbku
OK
20.0.0.102:6379> get gbku
lisi


dbsize 示例:
20.0.0.102:6379> keys *
name
bye
20.0.0.102:6379> dbsize
2


pexpire 示例:
20.0.0.102:6379> pexpire bye 500000
1
20.0.0.102:6379> pttl bye
493547
20.0.0.102:6379> pttl bye
491734
20.0.0.102:6379> pttl bye


pttl 示例:
20.0.0.102:6379> pttl gbku
-1         ### -1 为永久不超时


persist 示例:
20.0.0.102:6379> pttl bye
402176
20.0.0.102:6379> persist bye
1
20.0.0.102:6379> pttl bye
-1


randomkey 示例:
20.0.0.102:6379> keys *
cr
bye
ky1
wq
look
zbm
opt
20.0.0.102:6379> randomkey
bye
20.0.0.102:6379> randomkey
opt
20.0.0.102:6379> randomkey
cr
20.0.0.102:6379> randomkey
opt
  • redis-benchmark测试工具
-h :指定服务器主机名
-p :指定服务器端口
-c :指定并发连接数
-d :以字节的形式指定 SET/GET 值的数据大小(吞吐量)
-q :强制退出redis,仅显示 query/sec

示例1:向ip地址为 192.168.10.161、端口为6379的redis服务器发送100个并发连接与100000个请求测试性能
/usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -c 100 -n 100000

示例2:测试存取大小为100字节的数据表的性能
/usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100

Redis多数据操作

1、Redis 支持多数据,默认支持16个数据库,0-15命名
2、多数据库相互独立,互不干扰(不共享)
3、多数据库常用命令:
	多数据库之间切换
    多数据库间移动
    清除数据库内数据

Redis数据类型

Redis支持五种数据类型

  • string(字符串)
string 是 redis 最基本的类型,一个 key 对应一个 value
string 类型是二进制安全的。 redis 的 string 可包含任何数据。比如 jpg 图片或者序列化的对象

示例:
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> get name
"lisi"
  • hash(哈希)
redis hash 是一个键值(key=>value)对结合
redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

示例:
20.0.0.102:6379> hmset long id 7 age 22 sex 男
OK
20.0.0.102:6379> hget long id
"7"
20.0.0.102:6379> hget long age
"22"
20.0.0.102:6379> hget long sex
"\xe7\x94\xb7"

解决乱码问题:
[root@localhost utils]# redis-cli -h 20.0.0.102 -p 6379 --raw
20.0.0.102:6379> hget long sex
男
  • list(列表)
redis 列表是简单的字符集列表,按照插入顺序排序,可以重复
列表最多可存储 2的32次方 -1元素。

示例:
20.0.0.102:6379> lpush cook dage1 dage2 dage3
3
20.0.0.102:6379> lrange cook 0 10
dage3
dage2
dage1
20.0.0.102:6379> lpush cook nv1 nv2 nv3
6
20.0.0.102:6379> lrange cook 0 10
nv3
nv2
nv1
dage3
dage2
dage1
20.0.0.102:6379> lrange cook 0 0
nv3
20.0.0.102:6379> lrange cook 0 1
nv3
nv2
20.0.0.102:6379> lrange cook 1 2
nv2
nv1
20.0.0.102:6379> lrange cook 2 2                     ####把返回值看做是堆栈,查看的是索引,第一个值为0,第二个值为1 .....
nv1
20.0.0.102:6379> lrange cook 1 3                  ###从索引1开始(nv2),到3结束(dage3),它(nv2)本身也算1 
nv2
nv1
dage3
20.0.0.102:6379>

20.0.0.102:6379> LPUSH cook nv3
7 
20.0.0.102:6379> lrange cook 0 10                    ###可以存储相同值,可以重复
nv3
nv3
nv2
nv1
dage3
dage2
dage1
  • set(集合)
redis 的 set 是 string 类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)

示例:
  20.0.0.102:6379> sadd ky1 zhangfei liubei guanyu
3
20.0.0.102:6379> smembers ky1
zhangfei
guanyu
liubei
20.0.0.102:6379> sadd ky1 zhangfei
0
20.0.0.102:6379> smembers ky1
zhangfei
guanyu
liubei
  • zset(sorted set:有序集合)
redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数。redis正式通过分数来为集合中的成员进行从小到大的排序
zset 的成员是唯一的,但分数(score)却可以重复

zadd命令
添加元素到集合,元素在集合中存在则更新对应score

示例:
20.0.0.102:6379> zadd yaya 0 red
1
20.0.0.102:6379> zadd yaya 0 god
1
20.0.0.102:6379> zadd yaya 1 bule
1
20.0.0.102:6379> zadd yaya 1 gren
1
20.0.0.102:6379> zrangebyscore yaya 0 10
god
red
bule
gren
20.0.0.102:6379> zrangebyscore yaya 0 0
god
red
20.0.0.102:6379> zrangebyscore yaya 1 1
bule
gren

20.0.0.102:6379> zadd yaya 0.5 wuwu
1
20.0.0.102:6379> zrangebyscore yaya 0 10               ###将0.5插入到0 和 1之间,证明是有序集合
god
red
wuwu
bule
gren
  • 多数据库概念
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。
这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:
20.0.0.102:6379> select 1
OK
20.0.0.102:6379[1]> select 2
OK


迁移0号数据库中的yaya keys 到 1号数据库中:
20.0.0.102:6379[2]> select 1
OK
20.0.0.102:6379[1]> keys *

20.0.0.102:6379[1]> select 0
OK
20.0.0.102:6379> keys *
ky1
name
yaya
bye
20.0.0.102:6379> MOVE yaya 1
1
20.0.0.102:6379> select 1
OK
20.0.0.102:6379[1]> keys *
yaya
20.0.0.102:6379[1]> select 0
OK
20.0.0.102:6379> keys *
ky1
name
bye


比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据:
20.0.0.102:6379> FLUSHALL
OK
20.0.0.102:6379> keys *

20.0.0.102:6379> select 1
OK
20.0.0.102:6379[1]> keys *

20.0.0.102:6379[1]> select 2
OK
20.0.0.102:6379[2]> keys *

20.0.0.102:6379[2]>

到此结束,感谢浏览~