Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库,它也属于 nosql。
Redis 和 Memcached 类似,都是内存级别的数据缓存,主要用户数据缓存,它支持存储的 value 类型相对
更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。
Redis 不仅有丰富的特性(数据持久化到硬盘、 publish/subscribe、 key 过期),还有极高性能,经测试
Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
windows 1 、下载 Redis 的软件
https://github.com/MicrosoftArchive/redis/releases
nodejs安装
npm install redis --save 或者 cnpm install redis --save
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
//设置数据
client.set('username', '李四');
client.set('username', '李四','EX','5'); //设置过期 5 秒
//获取数据
client.get('username', function(err, val){
console.log(val);
});
linux安装
1 、 检查是否有 redis yum 源 是否直接命令安装
yum search redis
yum info redis
2 、 安装 epel 仓库 没有yum源 就安装此仓库 来支持安装
EPEL (Extra Packages for Enterprise Linux)是基于 Fedora 的一个项目,为“红帽系”的操作 系
统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux.
yum install epel-release -y
3 、 安装 redis 数据库 yum info redis yum install redis -y
4.systemctl start redis 启动 systemctl restart redis重启 systemctl enable redis 开机自启动
设置密码
vim /etc/redis.conf 进入配置
requirepass foobared的下面加入 requirepass 123456
保存退出 redis-cli auth 123456
vim 中撤销操作 esc 进入命令模式 特点不能输入文字 u回车 ctrl+r 恢复撤销
i 进入编辑模式 :q退出 :wq保存退出 :wq! 强制保存退出
:末行模式 esc命令模式下输入:进入
reidis 类型 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型
字符串类型也可以存储其他类型 需要使用JSON转换
哈希 其实就是对象 {name:'xx',age:18} 列表 集合其实就是数组
字符串基础语法
查看所有的 key: keys *
普通设置: set key value
设置并加过期时间: set key value EX 30 表示 30 秒后过期
获取数据: get key
删除指定数据: del key
删除全部数据: flushall
查看类型: type key
设置过期时间: expire key 20 表示指定的 key 20 秒后过期
列表基础语法
列表右侧增加值: rpush key value
列表左侧增加值: lpush key value
右侧删除值: rpop key
左侧删除值: lpop key
获取数据: lrange key
删除指定数据: del key
删除全部数据: flushall
查看类型: type key
nodejs 操作
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.rpush('testLists', 'a');
client.rpush('testLists', 'b');
client.rpush('testLists', 'c');
client.lpush('testLists', 2);
client.lpush('testLists', 1);
client.lrange('testLists',0, -1,(err,lists)=>{
if(err){
console.log(err);
return;
}
console.log(lists)
})
set 无序 无法增加重复值
基础语法
给集合增数据: sadd key value
删除集合中的一个值: srem key value
获取数据: smembers key
删除指定数据: del key
删除全部数据: flushall
nodejs
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.sadd('testSet', 1);
client.sadd('testSet', 'a');
client.sadd('testSet', 'bb');
client.smembers('testSet', function(err, v){
console.log(v);
});
哈希
基础语法
设置值 hmset : hmset zhangsan name "张三" age 20 sex “男”
设置值 hset : hset zhangsan name "张三"
获取数据: hgetall key
删除指定数据: del key
删除全部数据: flushall
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.hset('userinfo',"username", "zhangsan");
client.hmset('userinfo',"username","张三","age", "20","sex","男");
client.hgetall('userinfo',function(err,val){
console.log(val);
})
redis的pub/sub模式 可以实现聊天哦 可以实现跨服务器通信
发布方
client.publish('testPublish', 'message from publish.js');
订阅方 可以有多个订阅方
client.subscribe('testPublish');
client.on('message', function(channel, msg){
console.log('client.on message, channel:', channel, ' message:', msg);
});
只要发布方 一发布 订阅方直接做出回调
redis使用场景 有效避免高并发(点赞 排行榜 先缓存到redis 服务器端定时去取出数据存到数据库中) 首页缓存 短信验证码有效时间 等!
egg-redis的使用
npm i egg-redis 配置文件npm官网查询
egg封装redis服务
const Service = require('egg').Service;
class CacheService extends Service {
async set(key,value,seconds) {
const { redis } = this.app;
value = JSON.stringify(value);
if(!seconds){
await redis.set(key, value);
}else{
await redis.set(key, value, 'EX', seconds);
}
}
async get(key) {
const { redis } = this.app;
let data = await redis.get(key);
if (!data) return;
data = JSON.parse(data);
return data;
}
}
module.exports = CacheService;