赞
踩
主流的关系型数据库包括Oracle MySQL SQLserver等
主流的NoSQL数据库有Redis MongBD Hbase Memcached ElasticSearch TSDB等
数据存储方式不同
扩展方式不同
对事务性的支持不同
可用于应对 Web2.0 纯动态网站类型的三高问题(高并发、高性能、高可用)
- High performance——对数据库高并发读写需求
- Huge Storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率
若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降
若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力
在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程
若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程
若CPU资源比较紧张,采用单进程即可
(1)具有极高的数据读写速度:数据读取的速度最高可达到 110000 次/s,数据写入速度最高可达到 81000 次/s
(2)支持丰富的数据类型:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets 等数据类型操作
(3)支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
(4)原子性:Redis 所有操作都是原子性的
(5)支持数据备份:即 master-salve 模式的数据备份
缓存和数据库双写一致性问题
缓存雪崩问题
缓存击穿问题
缓存的并发竞争问题
一般应用在Session缓存、队列、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等
适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048
sysctl -p
yum install -y gcc gcc-c++ make
tar zxvf /opt/redis-7.0.9.tar.gz -C /opt/
cd /opt/redis-7.0.9
make
make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
mkdir /usr/local/redis/{conf,log,data}
cp /opt/redis-7.0.9/redis.conf /usr/local/redis/conf/
useradd -M -s /sbin/nologin redis
chown -R redis.redis /usr/local/redis/
vim /etc/profile
PATH=$PATH:/usr/local/redis/bin #增加一行
source /etc/profile
vim /usr/local/redis/conf/redis.conf bind 127.0.0.1 192.168.80.10 #87行,添加 监听的主机地址 protected-mode no #111行,将本机访问保护模式设置no。如果开启了,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应 port 6379 #138行,Redis默认的监听6379端口 daemonize yes #309行,设置为守护进程,后台启动 pidfile /usr/local/redis/log/redis_6379.pid #341行,指定 PID 文件 logfile "/usr/local/redis/log/redis_6379.log" #354行,指定日志文件 dir /usr/local/redis/data #504行,指定持久化文件所在目录 requirepass abc123 #1037行,增加一行,设置redis密码
vim /usr/lib/systemd/system/redis-server.service [Unit] Description=Redis Server After=network.target [Service] User=redis Group=redis Type=forking TimeoutSec=0 PIDFile=/usr/local/redis/log/redis_6379.pid ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
systemctl start redis-server
systemctl enable redis-server
netstat -lntp | grep 6379
redis-server:Redis 服务器启动命令
redis-benchmark:性能测试工具,用于检测 Redis 在本机的运行效率
redis-check-aof:修复有问题的 AOF 持久化文件
redis-check-rdb:修复有问题的 RDB 持久化文件
redis-cli:Redis 客户端命令行工具
redis-sentinel:Redis 哨兵集群使用
语法:redis-cli -h host -p port [-a password]
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
redis-cli -h 192.168.146.20 -p 6379 -a 'abc123'
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
192.168.146.20:6379> set teacher zhangsan OK 192.168.146.20:6379> get teacher "zhangsan" # keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。 192.168.146.20:6379> set k1 1 OK 192.168.146.20:6379> set k2 2 OK 192.168.146.20:6379> set k3 3 OK 192.168.146.20:6379> set v1 4 OK 192.168.146.20:6379> set v5 5 OK 192.168.146.20:6379> set v22 5 OK 192.168.146.20:6379> keys * #查看当前数据库中所有键 1) "k2" 2) "v1" 3) "v5" 4) "k3" 5) "k1" 6) "v22" 7) "teacher" 192.168.146.20:6379> keys v* #查看当前数据库中以 v 开头的数据 1) "v1" 2) "v5" 3) "v22" 192.168.146.20:6379> keys v? #查看当前数据库中以 v 开头的数据 1) "v1" 2) "v5" 192.168.146.20:6379> keys v?? #查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据 1) "v22"
判断键值是否存在
192.168.146.20:6379> exists teacher #判断 teacher 键是否存在
(integer) 1 # 1 表示 teacher 键是存在
192.168.146.20:6379> exists tea
(integer) 0 # 0 表示 tea 键不存在
可以删除当前数据库的指定key
192.168.146.20:6379> keys * 1) "k2" 2) "mycounter" 3) "key2" 4) "key4" 5) "myset2" 6) "myhash" 7) "myzset" 8) "v1" 9) "mykey" 10) "v5" 11) "k1" 12) "teacher" 13) "k3" 14) "mykey2" 15) "key3" 16) "myset" 17) "key1" 18) "v22" 192.168.146.20:6379> del v5 (integer) 1 192.168.146.20:6379> get v5 (nil)
可以获取 key 对应的 value 值类型
192.168.146.20:6379> type k1
string
expire为指定的key设置过期时间
ttl可以查看key还有多少秒过期,-1表示永不过期,-2表示已过期
192.168.146.20:6379> expire k1 10
(integer) 1
192.168.146.20:6379> ttl k1
(integer) 0
192.168.146.20:6379> ttl k1
(integer) -2
对已有的key进行重命名
命令格式:rename 源key 目标key
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据
192.168.146.20:6379> keys v*
1) "v1"
2) "v22"
192.168.146.20:6379> rename v22 v2
OK
192.168.146.20:6379> get v1
"4"
192.168.146.20:6379> get v2
"5"
192.168.146.20:6379> rename v1 v2
OK
192.168.146.20:6379> get v1
(nil)
192.168.146.20:6379> get v2
"4"
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名(不覆盖)
命令格式:renamenx 源key 目标key
192.168.146.20:6379> renamenx v2 teacher (integer) 0 192.168.146.20:6379> keys * 1) "k2" 2) "mycounter" 3) "key2" 4) "key4" 5) "myset2" 6) "myhash" 7) "myzset" 8) "mykey" 9) "teacher" 10) "k3" 11) "mykey2" 12) "key3" 13) "myset" 14) "v2" 15) "key1" 192.168.146.20:6379> get teacher "zhangsan" 192.168.146.20:6379> get v2 "4"
查看当前数据库中key的数目
192.168.146.20:6379> dbsize
(integer) 15
设置密码,查看密码
192.168.146.20:6379> config set requirepass abc123
OK
192.168.146.20:6379> auth abc123
OK
192.168.146.20:6379> config get requirepass
1) "requirepass"
2) "abc123"
Redis 支持多数据库,Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的
多数据库相互独立,互不干扰
命令格式:select 序号
使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库。
192.168.146.20:6379> select 10
OK
192.168.146.20:6379[10]> select 15
OK
192.168.146.20:6379[15]> select 0
OK
格式:move 键值 序号 192.168.146.20:6379> select 10 OK 192.168.146.20:6379[10]> select 15 OK 192.168.146.20:6379[15]> select 0 OK 192.168.146.20:6379> set k1 100 OK 192.168.146.20:6379> get k1 "100" 192.168.146.20:6379> select 1 OK 192.168.146.20:6379[1]> get k1 (nil) 192.168.146.20:6379[1]> select 0 #切换至目标数据库 0 OK 192.168.146.20:6379> get k1 #查看目标数据是否存在 "100" 192.168.146.20:6379> move k1 1 #将数据库 0 中 k1 移动到数据库 1 中 (integer) 1 192.168.146.20:6379> select 1 #切换至目标数据库 1 OK 192.168.146.20:6379[1]> get k1 #查看被移动数据 "100" 192.168.146.20:6379[1]> select 0 OK 192.168.146.20:6379> get k1 #在数据库 0 中无法查看到 k1 的值 (nil)
FLUSHDB :清空当前数据库数据
FLUSHALL :清空所有数据库的数据,慎用!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。