Redis 数据库介绍、安装及基本操作指令

  • 一、Redis 数据库概述
  • 1.1 Redis 介绍
  • 1.2 Redis 的下载与安装
  • 1.3 Redis 的基本操作指令
  • 1.4 Redis 的数据类型
  • 二、Redis 常用操作指令
  • 2.1 key 常用操作指令
  • 2.2 Redis 数据库通用指令
  • 三、Redis 配置文件.conf


一、Redis 数据库概述

1.1 Redis 介绍

1.1.1 Redis 概念
Redis(REmote DIctionary Server) 是一个由Salvatore Sanfilippo用C语言开发的开源的高性能键值对(key-value)数据库,它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis 与其他 key-value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

1.1.2 Redis 优点
(1)速度快
正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒。Redis速度快的原因如下

  • Redis的所有数据都是存放在内存中的,把数据放在内存中是Redis速度快的最主要原因。
  • Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  • Redis使用了单线程架构,预防了多线程可能产生的竞争问题。

(2)基于键值对的数据结构服务器
几乎所有的编程语言都提供了类似字典的功能,例如Java里的map、Python里的dict,类似于这种组织数据的方式叫作基于键值的方式,与很多键值对数据库不同的是,Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率。

Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中加入有关GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意思”的应用。

(3)丰富的功能
除了5种数据结构,Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以用来实现缓存。
  • 提供了发布订阅功能,可以用来实现消息系统。
  • 支持Lua脚本功能,可以利用Lua创造出新的Redis命令。
  • 提供了简单的事务功能,能在一定程度上保证事务特性。
  • 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。

(4)简单稳定
Redis的简单主要表现在三个方面:

  • Redis的源码很少,早期版本的代码只有2万行左右,3.0版本以后由于添加了集群特性,代码增至5万行左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着普通的开发和运维人员完全可以“吃透”它。
  • Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。
  • Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库),Redis自己实现了事件处理的相关功能。

Redis虽然很简单,但是不代表它不稳定。以笔者维护的上千个Redis为例,没有出现过因为Redis自身bug而宕掉的情况。

(5)客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、Python、C、C++、Nodejs等,第4章我们将对Redis的客户端进行详细说明。

(6)持久化
通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性,第5章我们将对Redis的持久化进行详细说明。

(7)主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。第6章我们将对Redis的复制进行详细说明。

(8)高可用和分布式
Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。Redis从3.0版本正式提供了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。

1.1.3 Redis 使用场景
(1)热点数据加速查询

(2)任务列队,如秒杀、抢购、购票等

(3)即时信息查询

(4)时效性信息控制,如验证码控制,投票控制。

(5)分布式数据共享,如分布式集群架构中的session分离

(6)消息队列

(7)分布式锁

1.2 Redis 的下载与安装

1.2.1 Redis 的下载与安装

Redis 的下载地址:https://github.com/MSOpenTech/redis/releases

打开网址进入一下界面,选择对应的版本,这里选择3.2.100。

redis从节点写入 redis如何将数据写入数据库_redis从节点写入

选择版本下载

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_02

解压下载后的Redis,得到下面的内容

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_03

文件说明

  • redis-server.exe:Redis 启动服务,相当于服务端
  • redis-cli.exe:Redis 操作端,相当于客户端
  • redis-check-aof.exe:做Redis 持久化
  • redis-benchmark.exe:做 Redis 性能测试

1.2.2 Redis 启动

Redis 的可以直接点击.exe文件启动,也可以执行cmd指令启动。

(1)点击redis-server.exe文件启动服务

redis从节点写入 redis如何将数据写入数据库_redis从节点写入_04

然后启动客户端redis-cli.exe操作Redis

redis从节点写入 redis如何将数据写入数据库_redis从节点写入_05

(2)执行cmd指令启动

先通过一个cmd窗口启动服务

redis从节点写入 redis如何将数据写入数据库_Redis 下载与安装_06

再通过一个cmd窗口启动客户端

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_07

1.3 Redis 的基本操作指令

1.3.1 添加信息
命令

set key value

示例

set name JACK

1.3.2 查询信息
根据key查询对应的value,如果key不存在,则返回空(nil)
命令

get key

这个命令时客户端的

示例

get name

示例

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_08

1.3.3 帮助
命令

help 命令名称
help @组名

示例

help 

help get

help @string

help

示例

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_09

1.3.4 退出
命令

quit
exit
<ESC>

1.4 Redis 的数据类型

Redis 本身是一个Map,其中所有的数据都是以key:value的形式存储的,Redis的数据类型指的是存储的数据的类型,即value的类型,而key永远都是字符串格式。

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

(2)操作命令

//添加/修改信息
set key value
//查询获取信息
get key
//删除信息
del key

//添加/修改信息
mset key1 value1 key2 value2 ..
//查询取信息
mget key1 key2 ...
//获取数据字符个数(字符串长度)
strlen key
//追加信息到原始信息后面(如果原始信息不存在,则为新建)
append key value

示例

127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> mset name jack age 18
OK
127.0.0.1:6379> mget name age
1) "jack"
2) "18"
127.0.0.1:6379> strlen name
(integer) 4
127.0.0.1:6379> append sex man
(integer) 6
127.0.0.1:6379> mget name age sex
1) "jack"
2) "18"
3) "manman"

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_10

其他命令

//设置数值数据增加指定的值
//每次增加1
incr key
//增加指定的值
incrby key increment
//增加指定的小数值
incrbyfloat key increment

//设置数值数据减少指定的值
//每次减少1
decr key
//减少执行的值
decrby key increment

//设置数据的生命周期
setex key seconds value
psetex key milliseconds value

示例

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_11


(3)注意事项

数据操作不成功反馈与数据正常操作反馈的差异

  • 表示运行结果成功
  • (integer) 0:0,表示false,操作失败。
  • (integer) 1:1,表示true,操纵成功。
  • 表示运行结果值
  • (integer) 1:1,表示1,操作1个。
  • (integer) 3:3,表示3,操作3个。

数据未获取到

  • 反馈结果为nii:等同于null

数据最大存储量

  • 512MB

数值计算最大范围

  • 9223372036854775807:java中long类型的最大值

1.4.2 hash 类型
(1)介绍
hash数据类型的底层是使用哈希表结构实现数据存储的。

(2)操作命令

/* 单个数据操作 */
//添加/修改信息
hset key filed value

//获取数据
hget key filed
hgetall key

//删除数据
hdel key filed1 [filed2]

/* 多个数据操作 */
//添加/修改信息
hmset key filed1 value1 filed2 value2...

//获取数据
hmget key filed1 filed2

/* 其他操作 */
//获取哈希表中字段的数量
hlen key

//获取哈希表中是否存在指定的字段
hexists key filed

//获取哈希表中所有的字段名或字段值
hkeys key
hvals key

//设置指定字段的数值数据增加指定范围的值
hincrby key filed increment
hincrbyfloat key filed increment

示例

redis从节点写入 redis如何将数据写入数据库_redis从节点写入_12

(3)注意事项

  • hash数据类型下的value只能存储字符串,不允许存储其他数据类型,也不存在数据嵌套现象。
  • 如果数据未获取到,返回值为nil
  • 每个hash可以存储2^32-1个键值对
  • hash数据类型与对象的数据存储形式相似,并且可以灵活的添加删除对象属性。但hash数据存储不是为存储大量对象而设计的,不能将hash作为对象列表使用。
  • hgetall命令可以获取全部属性,但是如果内部的filed过多,就会大大降低整体数据的i遍历效率。

1.4.3 list 类型
(1)介绍
list数据类型能保存多个数据,底层使用双向链表存储结构实现。

(2)操作指令

// 添加/修改数据
lpush key value1 [value2]...	//在左边添加修改
rpush key value1 [value2]...	//在右边添加修改

// 获取数据
lrange key start stop	//lrange key 0 -1 查看所有
lindex key index
llen key

// 获取并移除数据
lpop key
rpop key

//移除指定数据
lrem key count value

//规定时间内获取并移除数据(如果没有数据,则等待指定的时间)
blpop key1 [key2] timeout
brpop key1 [key2] timeout

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_13


(3)注意事项

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

1.4.4 set 类型
(1)介绍
set类型与hash类型的存储结构完全相同,仅存储键不存储值(nil),并且值不允许重复。

(2)操作指令

//添加数据
sadd key member1 [member2]

//获取全部数据
smembers key

//删除数据
srem key member1 [member2]

//获取集合数据总量
scard key

//判断集合中是否包含指定数据
sismember key member

//随机获取集合中指定数量的数据
srandmember key [count]

//随即及获取集合中某个数据并将该数据移出集合
spop key

示例

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_14

//求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]

//求两个集合的交、并、差集并存储到指定集合中(destination为指定集合)
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]

//将指定数据从原始集合中移动到目标集合中
smove source destination member

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_15

(3)注意事项
-set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间。

1.4.5 sorted_set 类型
(1)介绍
sorted_set类型是在set类型的存储结构基础上添加可排序字段。

(2)操作指令

//添加数据
zadd key score1 member1 [score2 member2]

//获取全部数据
zrange key start stop [WITHSCORES]	//正向排序,由小到大
zrevrange key start stop [WITHSCORES]	//反向排序,由大到小

//删除数据
zrem key member [member ...]

//按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]	//正向
zrevrangebyscore key max min [WITHSCORES]		//反向

//条件删除数据
zremrangebyrank key start stop		//按索引删除
zremrangebyscore key min max		//按排序范围删除

//获取集合数据总量
zcard key
zcount key min max	//指定范围内的数据个数

//集合交、并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ...]

//获取数据对应的索引(排名)
zrank key member
zrevrank key member

//score值获取与修改
zscore key member
zincrby key increment member

示例

redis从节点写入 redis如何将数据写入数据库_Redis 下载与安装_16

(3)注意事项

  • score保存的数据存储空间是64位,如果是整数范围是9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时
    候要慎重。
    sorted_ set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反
    复覆盖,保留最后一次修改的结果。

二、Redis 常用操作指令

2.1 key 常用操作指令

2.1.1 基本操作指令

//删除指定key
del key

//获取key是否存在
exists key

//获取key的类型
type key

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_17

2.1.2 时效性控制指令

//为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milli seconds- timest amp

//获取key的有效时间,key不存在则返回-2,存在则当前有效期时间,如果是永久有效则返回-1
ttl key
ptt1 key

//切换key从时效性转换为永久性
persist key

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_18


2.1.3 查询操作

//查询key
keys patern

patern匹配规则

  • *:匹配任意数量的任意符号
  • ?:配合-个任意符号
  • []:匹配一个指定符号

示例如下

redis从节点写入 redis如何将数据写入数据库_redis从节点写入_19


2.1.4 key 其他常用操作

//重命名key
rename key newkey
renamenx key newkey

//对所有key排序
sort

//其他key通用操作
help @generic

示例

redis从节点写入 redis如何将数据写入数据库_redis从节点写入_20

2.2 Redis 数据库通用指令

**2.2.1 数据库切换操作 **
Redis 为每个服务提供了16个数据库,编号从0到15,每个数据库之间的数据相互独立。

//切换数据库
select index

//退出
quit

//测试服务器是否接通
ping

//Redis控制台打印日志
echo message

示例

redis从节点写入 redis如何将数据写入数据库_Redis 常用指令_21

2.2.2 数据相关操作

//移动过数据到指定数据库
move key db

//查看当前库有多少个key
dbsize 		

//清除当前数据库的数据
flushdb		

//清除所有数据库的数据
flushall

示例

redis从节点写入 redis如何将数据写入数据库_Redis 数据库_22

三、Redis 配置文件.conf

服务器配置
设置服务器以守护进程的方式运行

daemonize yes|no

设置主机地址

bind 127.0.0.1

设置服务器端口号

port 6379

设置数据库数量

databases 16

日志配置
设置服务器以指定日志记录级别(默认是verbose)

1og1evel debug|verbose|notice|warning

日志记录文件名

1ogfile 端口号.1og

客户端配置
设置同一时间最大客户端连接数,默认0表示无限制。当客户端连接到达上限,Redis会关闭新的连接

maxelients 0

客户端闲置等待最大时长,达到最大值后关闭连接,如需关闭该功能,设置为0

timeout 300

多服务器快捷配置
导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护

include /path/server-端口号.conf