11月25, 2018

redis学习笔记

做个笔记。

简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制的字符串、列表、哈希值、集合和有序集合等数据类型操作。
  • 原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行
  • 单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 发布/订阅, 通知, key 过期等等特性。

安装

brew install redis

运行及数据库说明

安装完成,会有两个命令:redis-serverredis-cli

先运行redis-server

alt

然后在新的命令行中,运行:redis-cli

alt

当然你也可以选择后台启动:redis如何后台启动

话说如果是本地,完全不需要后台启动,因为一旦想kill,还是要敲命令行,先要找到进程ID,再kill -9 进程ID

默认redis有16个数据库:

alt

alt

通过select 索引值来切换不同的数据库。

数据类型

  • 字符串
  • 哈希值
  • 链表
  • 集合
  • 有序列表

字符串

字符串是最基本的类型,一个key对应一个value

alt

简单用法如上图所示,当然还有其他的,像数字+1,-1:

alt

还有像对键的处理:删除键、给键设置过期时间、判断一个key是否存在

# DEL key  删除 key
DEL user 
# EXISTS key 判断一个key是否存在
EXISTS user 
# EXPIRE key seconds  设置过期时间
EXPIRE user 10 
# TTL key 以秒为单位返回给定key的剩余生存时间
TTL user 
# TYPE key 返回key所存储的值的类型
TYPE user

alt

哈希值

哈希值是一个字符串类型的Key和值的映射表,特别适合用于存储对象。

  • HSET HMSET 设置值
  • HGET HGETALL 获取值
  • HDEL key field 删除键
  • HKEYS 获取所有的KEYS

alt

需要注意的是没有hmdel

列表

列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

  • LPUSH RPUSH 添加元素
  • LRANGE 查看元素
  • LPOP RPOP 弹出元素
  • LINDEX ids 索引
  • LLEN key 获取列表长度
  • LREM key count value

alt

alt

LREM key count value

移除列表元素

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。

在node中的使用

在上文中并没有提到集合和有序集合,是因为好像目前程序中用的最多的就是字符串、哈希、列表。所以真用到了,我以后会来继续补充的。

基本使用

const redis = require('redis');
const client = redis.createClient(6379, '127.0.0.1');
client.on('error', (error) => {
  console.error(error);
});
// 1. 字符串类型
client.set('name', 'zpu', redis.print);
client.get('name', redis.print);
client.get('name', (err, data) => {
  console.log(data);
});
// 2. 集合
client.hset('user', 'name', 'zpu', redis.print);
client.hset('user', 'age', '8', redis.print);
client.hget('user', 'age', redis.print);
client.hkeys('user', (err, replies) => {
  replies.forEach((item) => {
    client.hget('user', item, redis.print);
  });
});

alt

结合koa

网上有一个脚手架koa-generator来快速生成koa2的项目。

场景一:session

import Koa from 'koa';
import session from 'koa-generic-session';
import Redis from 'koa-redis';

const app = new Koa()
app.use(session({key: 'my', prefix: 'my:uid', store: new Redis()}))

里面可以传入一个options

alt

详见:koa-redis

场景二:发送验证码

import Redis from 'koa-redis';

let Store = new Redis().client

// ...
/* 往redis里面存相应的code、expire、email */
Store.hmset(`nodemail:${user}`, 'code', code, 'expire', expire, 'email', email)
// ...

发布订阅

Redis 发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息,客户端可以订阅任意数量的频道。

const redis = require('redis');
const client1 = redis.createClient(6379, '127.0.0.1');
const client2 = redis.createClient(6379, '127.0.0.1');
client1.subscribe('food');
client1.subscribe('drink');
client1.on('message', (channel, message) => {
  console.log(channel, message);
  client1.unsubscribe('food');
});

client2.publish('food', '面包');
client2.publish('drink', '桔汁');
setTimeout(() => {
  client2.publish('food', '面包2');
  client2.publish('drink', '桔汁2');
}, 2000);

alt

事务

Redis 事务可以一次执行多个命令

  • 多个命令可以在执行EXEC命令之前放入缓存队列 收到EXEC命令后会将缓存队列执行
  • 在执行事务的过程中,新提交的并不能被插入到事务执行序列中
  • DISCARD 可以取消事务,放弃执行事务块内的所有命令

alt

alt

  • 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的

  • 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做

const redis = require('redis');
const client = redis.createClient(6379, '127.0.0.1');
client.multi().hset('user2', 'name2', 'zpu2').hset('user2', 'age2', '20').exec();

alt

安全

可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。

Redis 安全

Redis 请务必注意 Redis 安全配置,否则将导致轻松被入侵

本文链接:www.my-fe.pub/post/redis-note.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。