Redis简介
Redis是一个远程内存数据库,不仅性能强,而且还具有复制特性以及为解决问题而生的独一无二的数据模型
Redis是一个速度非常快的非关系型数据库,可以存储键和5种不同类型值的之间的映射,可以将存储在内存中的键值对数据持久化到硬盘,可以使用复制特性来阔爱站读性能,又可以使用客户端分片来扩展写性能。
Redis与其他数据库及软件比较
名称 | 类型 | 数据存储 | 数据查询 |
---|---|---|---|
Redis | 使用内存存储的非关系型数据库 | 字符串、列表、集合、散列表、有序集合 | 每种数据类型都有自己的命令 |
Memcached | 使用内存存储的键值缓存 | 键值之间的映射 | 创建、读取、更新、删除等 |
MySQL | 关系型数据库 | 每个数据库包含多个表,每个表包含多行 | select、insert、update、delete等 |
MongoDB | 使用磁盘存储的非关系型数据库 | 每个数据库包含多个表,每个表包含多个BSON文档 | 创建、读取、更新、删除等 |
Redis数据持久化
时间点转存(内存->硬盘)
Redis安装及配置
Redis的安装
Linux CentOS 7
官网https://redis.io/download
官网不支持在windows下安装,但可以在windows下使用它的客户端
http://download.redis.io/releases/redis-5.0.8.tar.gz
- 下载安装包并解压
/tmp/> wget http://download.redis.io/releases/redis-5.0.8.tar.gz
/tmp/> tar -zxvf redis-5.0.8.tar.gz
- 安装gcc依赖
> yum -y install gcc gcc-c++ autoconf automake
- 编译配置
/tmp/redis-5.0.8/>make MALLOC=libc
# 如果之前编译错误,用以下命令清除缓存文件
> make distclean
- 编译安装
/tmp/redis-5.0.8/src/> make install
# 默认生成到/usr/local/bin/>
- 启动Redis服务的几种方式
直接启动
> redis-server
9093:C 20 Mar 2020 11:12:55.725 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9093:C 20 Mar 2020 11:12:55.725 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=9093, just started
9093:C 20 Mar 2020 11:12:55.725 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
9093:M 20 Mar 2020 11:12:55.726 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 9093
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
9093:M 20 Mar 2020 11:12:55.727 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9093:M 20 Mar 2020 11:12:55.727 # Server initialized
9093:M 20 Mar 2020 11:12:55.727 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
9093:M 20 Mar 2020 11:12:55.727 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
9093:M 20 Mar 2020 11:12:55.728 * Ready to accept connections
后台进程的方式启动
> vim /tmp/redis-5.0.8/redis.conf
搜索 /daemon
找到 daemonize no
更改成 daemonize yes
/tmp/redis-5.0.8/> cp redis.conf /etc/
> redis-server /etc/redis.conf
# 查看进程
> ps -ef | grep redis
root 9141 1 0 11:23 ? 00:00:00 redis-server 127.0.0.1:6379
root 9146 7404 0 11:23 pts/0 00:00:00 grep --color=auto redis
# 关闭后台redis服务
> kill -9 9141
伪装成服务里启动
# 查看配置脚本
/tmp/redis-5.0.8/utils/> vim install_server.sh
# 执行脚本
/tmp/redis-5.0.8/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] /etc/redis.conf
Please select the redis log file name [/var/log/redis_6379.log] /var/log/redis.log
Please select the data directory for this instance [/var/lib/redis/6379] /var/lib/redis
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis.conf
Log file : /var/log/redis.log
Data dir : /var/lib/redis
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!
/var/run/redis_6379.pid exists, process is already running or crashed
Installation successful!
>rm /var/run/redis_6379.pid
rm:是否删除普通文件 "/var/run/redis_6379.pid"?y
# 启动/停止服务
> service redis_6379 start
> service redis_6379 stop
# 设置开机启动服务
> systemctl enable redis_6379
# 如果是远程链接,别忘记开防火墙
> firewall-cmd --add-port=6379/tcp --permanent
> firewall-cmd --reload
Redis常用配置
配置文件redis.conf
- ip绑定配置 bind 如果设置了则只执行此ip的请求
- 保护模式配置 protected-mode
- 端口配置 port
- 后台运行配置 daemonize
- 进程文件配置 pidfile
- 持久化配置 save
- 连接认证配置 masterauth
- …
> vim /etc/redis.conf
Redis数据结构及应用
Redis提供的5种结构
结构类型 | 存储值 | 读写能力 |
---|---|---|
STRING | 可以是字符串、整数及浮点数 | 对整个字符串或者字符串中一部分操作;对整数和浮点数执行increment或者decrement |
LIST | 链表,每个节点包含一个STRING | 从链表两端push或者pop元素;根据偏移量对链表进行裁剪;读取单个或多个元素;根据值查找或移除元素 |
SET | 包含STRING的无序集合,其值具有唯一性 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
ZSET | STRING成员于浮点数分值之间的有序映射,排列顺序由分值大小决定 | 添加、获取、移除单个元素;根据分值范围或者成员获取元素 |
命令行执行redis
> redis-cli -h 127.0.0.1 -p 6379
# STRING
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
# LIST
127.0.0.1:6379> rpush list item
(integer) 1
127.0.0.1:6379> rpush list item2
(integer) 2
127.0.0.1:6379> rpush list item3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "item"
2) "item2"
3) "item3"
127.0.0.1:6379> lindex list 0
"item"
127.0.0.1:6379> lpop list
"item"
127.0.0.1:6379> lrange list 0 -1
1) "item2"
2) "item3"
# SET
127.0.0.1:6379> sadd set item
(integer) 1
127.0.0.1:6379> sadd set item2
(integer) 1
127.0.0.1:6379> sadd set item3
(integer) 1
127.0.0.1:6379> sadd set item1
(integer) 1
127.0.0.1:6379> sadd set item
(integer) 0
127.0.0.1:6379> sismember set item4
(integer) 0
127.0.0.1:6379> sismember set item1
(integer) 1
127.0.0.1:6379> srem set item2
(integer) 1
127.0.0.1:6379> srem set item2
(integer) 0
127.0.0.1:6379> smembers set
1) "item"
2) "item1"
3) "item3"
# HASH
127.0.0.1:6379> hset hash subkey1 value1
(integer) 1
127.0.0.1:6379> hset hash subkey2 value2
(integer) 1
127.0.0.1:6379> hset hash subkey1 value1
(integer) 0
127.0.0.1:6379> hset hash subkey3 value3
(integer) 1
127.0.0.1:6379> hgetall hash
1) "subkey1"
2) "value1"
3) "subkey2"
4) "value2"
5) "subkey3"
6) "value3"
127.0.0.1:6379> hdel hash subkey3
(integer) 1
127.0.0.1:6379> hget hash subkey3
(nil)
# ZSET
127.0.0.1:6379> zadd zset 728 member1
(integer) 1
127.0.0.1:6379> zadd zset 982 member0
(integer) 1
127.0.0.1:6379> zadd zset 982 member0
(integer) 0
127.0.0.1:6379> zrange zset 0 -1
1) "member1"
2) "member0"
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrem zset member1
(integer) 1
127.0.0.1:6379> zrem zset member1
(integer) 0
127.0.0.1:6379> zrange zset 0 -1
1) "member0"
Redis在Node.js中的应用
在windows中远程linux
> redis-cli -h 192.168.129.129
192.168.129.129:6379> get age
"20"
192.168.129.129:6379> incr age
(integer) 21
192.168.129.129:6379> decr age
(integer) 20
192.168.129.129:6379> decrby age 10
(integer) 10
Node.js链接Redis
> npm install redis
// 引入和连接redis
const redis = require('redis')
const client = redis.createClient(6379, '192.168.129.129')
Node.js操作Redis数据
// console.log(client)
const cb = (err, data) => {
console.log('error:', err, 'data:', data)
}
// STRING
client.set('name', '张三', cb)
client.get('name', cb)
client.set('age', 20, cb)
client.get('age', cb)
/**
error: null data: OK
error: null data: 张三
error: null data: OK
error: null data: 20
*/
// LIST
client.del('friends', cb)
client.rpush('friends', '王五', '赵六', cb)
client.lrange('friends', 0, -1, cb)
client.lpush('friends', '田七', '王八', cb)
client.lrange('friends', 0, -1, cb)
// rpop.lpop
client.lindex('friends', 1, cb)
client.ltrim('friends', 1, 2, cb)
client.lrange('friends', 0, 1, cb)
/**
error: null data: 1
error: null data: 2
error: null data: [ '王五', '赵六' ]
error: null data: 4
error: null data: [ '王八', '田七', '王五', '赵六' ]
error: null data: 田七
error: null data: OK
error: null data: [ '田七', '王五' ]
*/
// SET
client.sadd('ids', 1, 2, cb)
client.smembers('ids', cb)
client.srem('ids', 2, cb)
/**
error: null data: 0
error: null data: [ '1', '2' ]
error: null data: 1
*/
知识技能获取,感谢[网易云课堂 - 微专业 - 前端高级开发工程师]运营团队。