文章目录
一、关系型数据库与非关系型数据库
关系型数据库 | 非关系型数据库 |
---|---|
包括Oracle 、MySQL、SQL Server、Microsoft Access、DB2 等 | 包括Redis、MongDB、Hbase、CouhDB等 |
存储标准数据结构(int,float,double,char) | 存储类型一般为string |
数据库名称可以自定义 | 数据库名不能自定义,Redis默认(0-15)16个子数据库 |
存在表结构、主键、外键 | 只有键值对 |
面向记录 | 满足数据库高并发、海量数据吞吐、高可扩展性与高可用性要求 |
二、Redis介绍
- Redis基于内存运行并支持持久化
- 采用key-value(键值对)的存储形式
- 优点
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份
三、redis安装
- 解压压缩包
准备包redis-5.0.7.tar.gz ,直接拉进Xshell的/opt下
[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz
[root@localhost opt]# ls
redis-5.0.7 redis-5.0.7.tar.gz rh
- 编译安装
[root@localhost opt]# cd redis-5.0.7/
[root@localhost redis-5.0.7]# make
从上面信息可以看到各种文件所在路径
PREFIX : /usr/local
BINDIR : /usr/local/bin
DATADIR : /usr/local/share
INCLUDEDIR : /usr/local/include
LIBDIR : /usr/local/lib
MANDIR : /usr/local/share/man
[root@localhost redis-5.0.7]# make install
运行软件自带的配置脚本,一路回车
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379 ####默认端口
Config file : /etc/redis/6379.conf ####配置文件所在位置
Log file : /var/log/redis_6379.log ###日志所在位置
Data dir : /var/lib/redis/6379 ##数据目录
Executable : /usr/local/bin/redis-server ##执行文件路径
Cli Executable : /usr/local/bin/redis-cli #####客户端工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
- 修改配置文件
[root@localhost redis-5.0.7]vim/etc/redis/6379.conf
:set nu 查看行号,在下面对应行去掉注释,或者进行修改
70 bind 127.0.0.1 20.0.0.23 ##加上本机Ip,监听20.0.0.23和环回口
93 port 6379 ##端口
137 daemonize yes ##启用守护进程
159 pidfile /var/run/redis_6379.pid ##指定PID文件
167 loglevel notice ###日志级别为notice
172 logfile /var/log/redis_6379.log ###指定日志文件
- 开启并查看运行状态
[root@localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost utils]# netstat -anpt | grep redis
tcp 0 0 20.0.0.23:6379 0.0.0.0:* LISTEN 21083/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 21083/redis-server
redis启动脚本位置在 /etc/init.d/redis_6379 运行时加上绝对路径,或者可自己写入脚本交给Service管理
- 登录
[root@localhost utils]# redis-cli -h 20.0.0.23 -p 6379
20.0.0.23:6379>
然后就可以使用了
-h 登录地址 -p 端口
四、redis数据类型与实例
Redis支持五种数据类型:
- string (字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
4.1string(字符串)
- string是redis最基本的类型,与Memcached一模一样的类型,一个key对应一个value。
- string类型是二进制安全的。redis的string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型是Redis最基本的数据类型,string 类型的值最大能存储512MB。
- 例
20.0.0.23:6379> set name alis #set存放数据
OK
20.0.0.23:6379> get name #get获取数据
"alis"
20.0.0.23:6379> keys * #查看键值
1) "name"
20.0.0.23:6379> type name #查看键类型
string
4.2Hash(哈希字典)
-
Redis hash是一个键值(key=>value)对集合。
-
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
-
每个hash可以存储2的32次方-1键值对。
-
作用场景:
健值对集合,即编程语言中的Map类型
适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值 -
例
20.0.0.23:6379> hmset info name victor age 22 sex 男
##hmset 存取多个数据,info为存储对象 name-victor sge-22 sex-男是对象的描述属性
OK
20.0.0.23:6379> hget info name #hget获取数据,一次只能查看对象的一个属性
"victor"
20.0.0.23:6379> hget info age
"22"
20.0.0.23:6379> hget info sex #识别不出中文,乱码
"\xe7\x94\xb7"
20.0.0.23:6379> keys *
1) "name"
2) "info"
20.0.0.23:6379> type info #类型为hash
hash
--raw 解决中文乱码问题
[root@localhost utils]# redis-cli -h 20.0.0.23 -p 6379 --raw ##登录的时候加上raw项,识别中文
20.0.0.23:6379> hget info sex
男
4.3List(列表)
-
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。可以添加一个元素到 表的头部(左边)或者尾部(右边)
-
列表最多可存储2^32 -1 个元素。
-
作用场景:
1、增删快,提供了操作某一段元素的API
2、最新消息排行等功能(比如朋友圈的时间线)
3、消息队列 -
一个key写入多个value时,遵循着先入后出,后入先出的堆栈规则
-
存入的value可以重复
-
例
20.0.0.23:6379> lpush hobby draw dance song #lpush存入数据 draw在前存入
3
20.0.0.23:6379> lrange hobby 0 10 #lrange读取数据,draw变成了最后一个读取
song
dance
draw
20.0.0.23:6379> lrange hobby 0 0
song
20.0.0.23:6379> lrange hobby 1 1
dance
20.0.0.23:6379> lrange hobby 2 2
draw
list可以重复存储
20.0.0.23:6379> lpush hobby dance
4
20.0.0.23:6379> lrange hobby 0 10
dance
song
dance
draw
20.0.0.23:6379> type hobby #查看类型为type
list
4.4Set(无序集合)
-
Redis的 Set 是 string 类型的无序集合。
-
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)
-
作用场景:
1、比如QQ的共同好友
2、利用唯一性,统计访问网站的所有独立ip
3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 -
集合存储,不论有序还是无序都不能存储重复的值
-
例
20.0.0.23:6379> sadd animal dog cat duck # sadd存入
3
20.0.0.22:6379> smembers animal #smembers 查看数据
cat
dog
duck
#######只能一起拿出来看,不能单独看其中一个
20.0.0.23:6379> sadd animal dog #存入重复的返回状态码0,报错
0
20.0.0.23:6379> type animal ##查看类型set
set
4.5Zset(sorted set:有序集合)
-
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
-
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
-
zset的成员是唯一的,但分数(score)却可以重复。
-
作用场景:
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列 -
例
20.0.0.23:6379> zadd animal 0 dog ##zadd添加数据,分数为0
1 ##存储成功,返回状态码1
20.0.0.23:6379> zadd animal 0 cat ##存储时分数可以重复
1
20.0.0.23:6379> zadd animal 0.5 rabbit
1
20.0.0.23:6379> zadd animal 2 monkey
1
20.0.0.23:6379> zrangebyscore animal 0 10 #####zrangebyscore 按分数排序查询
cat
dog
rabbit
monkey
20.0.0.23:6379> zadd animal 1.7 bird ####插入数据后,发现按分数有序插入
1
20.0.0.23:6379> zrangebyscore animal 0 10
cat
dog
rabbit
bird
monkey
20.0.0.23:6379> zrangebyscore animal 0 1 ####获取数据的时候可以按分数段获取单个或多个
cat
dog
rabbit
20.0.0.23:6379> zrangebyscore animal 1 2
bird
monkey
五、常用命令
除了上面数据常用的五种类型用法,还有一些常用命令
5.1select切换数据库
我们知道redis有16个子数据库,0-15,我们默认进去的是数据库0,要换别的数据库怎么办?
例
20.0.0.23:6379> select 1 ##切换到数据库1
OK
20.0.0.23:6379[1]> select 2 ##切换到数据库2
OK
20.0.0.23:6379[2]> keys * ##看一下,没有数据,数据库之间隔离
20.0.0.23:6379[2]> select 0 ##回到0
OK
20.0.0.23:6379> keys * ##keys还在
name
info
animal
hobby
5.2数据迁移move
20.0.0.23:6379> move name 1 ##move 键 数据库序号
1
20.0.0.23:6379> keys *
info
animal
hobby
20.0.0.23:6379> select 1
OK
20.0.0.23:6379[1]> get name ###数据成功迁移
alis
5.3高危FLUSHALL
数据库之间虽然互相隔离,但是也有共通之处,FLUSHALL删除所有数据库数据
20.0.0.23:6379[1]> FLUSHALL
OK
20.0.0.23:6379[1]> get name
20.0.0.23:6379[1]> select 0
OK
20.0.0.23:6379> keys *
5.4检测key存在exist
20.0.0.23:6379> set name moli
OK
20.0.0.23:6379> EXISTS name ##存在,返回状态码1
1
20.0.0.23:6379> exists hobby ##不存在,返回状态码0
0
5.5key重命名rename
20.0.0.23:6379> RENAME name girl
OK
20.0.0.23:6379> get girl
moli
5.6时间管理
- PTTL 查看剩余时间(毫秒)
- PEXPIRE 设置超时时间
- PERSIST 取消超时时间
20.0.0.23:6379> PTTL girl ##未设置超时时间,永久,为-1
-1
20.0.0.23:6379> PEXPIRE girl 30000 ##设置超时时间30s
1
20.0.0.23:6379> PTTL girl #######查看剩余时间,可以看到倒计时
20390
20.0.0.23:6379> PTTL girl
18881
20.0.0.23:6379> PTTL girl
17410
20.0.0.23:6379> PTTL girl
16294
20.0.0.23:6379> PERSIST girl ####取消超时时间
1
20.0.0.23:6379> PTTL girl
-1
5.7随机返回key——RANDOMKEY
20.0.0.23:6379> mset name zhangsan age 19 score 88 ###mset 一次存储多个键值对
OK
20.0.0.23:6379> RANDOMKEY ######随机返回key的一个值
score
20.0.0.23:6379> RANDOMKEY
girl
20.0.0.23:6379> RANDOMKEY
girl
20.0.0.23:6379> RANDOMKEY
score
20.0.0.23:6379> RANDOMKEY
girl
20.0.0.23:6379> RANDOMKEY
name
20.0.0.23:6379> RANDOMKEY
age
20.0.0.23:6379> RANDOMKEY
girl