添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
彷徨的骆驼  ·  Java - ...·  2 年前    · 
坚韧的充值卡  ·  Cloud Native Applications·  2 年前    · 

最近公司某个项目涉及到了视频直播的模块,看了网上许多案例都是基于rtmp或hls的方案进行直播的,考虑到日后chrome不再支持flash,于是试着结合MSE和node中间层进行直播流的推送和解析操作,其中就涉及到了node操作redis的环节。

一、配置ORM库

一般来说,无论服务端还是中间层,针对mysql和mongoDB这种数据库都会使用ORM进行操作,redis也一样,因此在开始使用redis之前,我们首先应该下载好一个提供ORM操作层的第三方包,我这里选择了 ioredis 这个库:(当然,前提是本地已经安装好了redis并且成功开启,具体教程这里就不阐述了)

npm install ioredis

二、编写配置文件

编写配置文件是为了免去每次进行数据库操作或连接数据库都重写porthost等参数的麻烦,而且尽可能地保持“一库一连”,即全局连接一次,处处都运用这个实例进行读写,这样可以最大限度保证性能。
本人的redis工具配置目录如下:

--redis
 |--redisConnection.ts  //连接逻辑
 |--redisOperate.ts  //数据库操作逻辑

考虑到生产与开发的环境不同,连接redis的端口和地址也不同,建议为两个环境各自写一个config。
redisConnection.ts 内容如下:

    import * as ioredis from 'ioredis';
import { resolve } from 'dns';
interface redisConfig {
    port:number,
    host:string,
    password?:string
    db?:number //连接的数据库id,默认为0,即第一个数据库
    family?:number //可填参数:4、6 (ipv4\ipv6)
let clientCreate = (config:redisConfig,callback_:Function) => {
    let redis:ioredis.Redis = new ioredis(config);
    redis.on('connect',()=>{ //根据 connect 事件判断连接成功
        callback_(null,redis) //链接成功, 返回 redis 连接对象
    redis.on('error',(err)=>{ //根据 error 事件判断连接失败
        callback_(err,null) //捕捉异常, 返回 error
let redisConn = (options?:redisConfig) => {
    let config = options
    return new Promise((resolve,reject) => { //返回API调用方 一个 promise 对象
        clientCreate(config,(err:any,conn:ioredis.Redis) => {
            if(err) {
                reject(err)
            resolve(conn) //返回连接的redis对象
export default redisConn

这样就完成了一个连接redis的通用实例了,这样做的好处是可操作空间大,也利于后续封装

三、编写读写操作文件

由于ioredis这个第三方库的很多操作返回都是Promise对象,如果直接在项目里使用很容易会造成回调过多的情况,因此封装成async/await的方式会更利于开发,那么我们可以这样来编写redisOperate.ts文件:

import redisConnect from './redisConnection'
import * as ioredis from 'ioredis'
import getConfig from '../../config/index';
export interface redisTool {
    setString(key:string,value:any):Promise<string|void>
    getString(key:any):Promise<string>
    delString(key:string):Promise<number|null>
    getDbSize():Promise<number>
    connToRedis():Promise<unknown>
interface redisConfig {
    port:number,
    host:string,
    password?:string
    db?:number
    family?:number
const env = process.env.NODE_ENV;
let redisConfig:redisConfig = {
    port: getConfig(env).port_redis,
    host: getConfig(env).host_redis
class RedisTool implements redisTool {
    redis:ioredis.Redis
    config:redisConfig
    constructor(opt?:any){
      this.redis = null;
        if(opt){
            this.config = Object.assign(redisConfig,opt)
        }else{
            this.config = redisConfig
        // this.connToRedis()
      this.connToRedis().then(res=>{
          if(res){
              console.log('redis connet success')
      }).catch(e=>{
          console.error('The Redis Can not Connect:'+e)
    /**连接redis */
    connToRedis(){
        return new Promise((resolve, reject) => {  
            if(this.redis) {
                resolve(true) //已创建
            } else {
                redisConnect(this.config).then((resp:ioredis.Redis) =>  { 
                    this.redis = resp
                    resolve(true) }
                ).catch(err => { reject(err) })
    /**存储string类型的key-value */
    async setString(key:string,value:any){
        let val:string = typeof(value)!=='string'?JSON.stringify(value):value;
        let k:string = typeof(value)!=='string'?JSON.stringify(key):key;
        try {
            const res = await this.redis.set(k, val);
            return res;
        catch (e) {
            console.error(e);
    /**获取string类型的key-value */
    async getString(key:any){
        let id:string = typeof(key)!=='string'?JSON.stringify(key):key;
        try{
            const res = await this.redis.get(id);
            return res
        }catch(e){
            console.error(e);
            return null
    /**删除string类型的key-value */
    async delString(key:string){
        let id:string = typeof(key)!=='string'?JSON.stringify(key):key;
        try{
            const res =  await this.redis.del(id);
            return res
        }catch(e){
            console.error(e);
            return null
    /**获取当前数据库key的数量 */
    async getDbSize(){
        try{
            const res = await this.redis.dbsize();
            return res
        }catch(e){
            console.error(e);
            return null
export const default_redis = new RedisTool();
需要用到多少个数据库,就定义多少个实例常量,这样的好处是:
每次个模块调用redis的时候,始终是取第一次生成的实例,避免了多次连接redis的尴尬
export const redis_db1 = new RedisTool({db:1})
// export const redis_db2 = new RedisTool({db:2})
// export const redis_db3 = new RedisTool({db:3})
// export const redis_db4 = new RedisTool({db:4})
export default default_redis

四、使用方法实例

当我们把所有redis配置和操作层逻辑都封装好之后,就可以在任意需要用到的redis直接使用生成的实例了,比如在某一模块下进行读写操作:

import {default_redis} from '../../utils/redis/redisOperate' 
//引入我们编写好的操作逻辑文件,导出我们提前生成好的redis实例
let redisTool_db0 = default_redis
const test = async (str:string):Promise<void> => {
    let key:string = str;
    let res:string = await redisTool_db.setString(key,'这是存入的value')
    if(res!==null){console.log('写入成功')}
    else{console.log('写入失败')}
    let res2:string = await redisTool_db.getString(key)
    if(res2!==null){console.log('读取成功,value是:'+ res2)}
    else{console.log('读取失败')}
test('hello')
//写入成功
//读取成功,value是:这是存入的value
使用Redis作为存储并使用TypeScript编写的Time report GraphQL服务器不是因为它是一个不错的选择,而是作为一种以不同方式进行操作的练习。
  yarn install
  yarn start
                                    点击关注公众号,实用技术文章及时了解前言最近,Redis 官方博客宣布推出四个用于 Redis 的客户端工具库:Redis OM(对象映射库,Object Mapping),目标是让应用程...
                                    Typecho虽然轻量,但终究仍是PHP动态脚本,访问时需要频繁调取数据库的信息,导致并发值一高,CPU就100%占用,无法处理新的请求信息。不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。支持数据的持久化,可以将内存的数据保存在磁盘,重启的时候可以再次加载进行使用。来设置缓存,从而不用频繁调动数据库,来达到加速访问的目的。支持数据的备份,即master-slave模式的数据备份。系统,如果你是Windows系统,可考虑其他软件。
安装 koa-generic-session 、 koa-redisredis 插件
启动 redis、接口服务(参考链接:https://www.runoob.com/redis/redis-install.html)
2. 实现
配置 session
// app.js
const session = require("koa-generic-session");
const redisStore = require("koa-redis");
// 配置路由之前,sess
                                    <br />JavaScript跨域总结与解决办法<br />本文来自网络(http://f2e.me/200904/cross-scripting/,该网址已不能访问),仅作个人读书笔记之用,并稍作修改和补充。什么是跨域<br />JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。这里把涉及到跨域的一些问题简单地整理一下:<br />首先什么是跨域,简单地理解就是因为JavaScript同源策略的限制,a.com 
local expiry = ARGV[2]
local value = ARGV[3]
local reply = redis.call("SETNX", key, value)
if 1 == reply then 
  redis.call("EXPIRE", k...
                                    搭建环境:linux是centos7.4(请注意centos7以下版本的防火墙跟centos7以上的不同,使用redis客户端连接redis时会有区别,建议使用centos7以上版本)一、下载redis客户端二、连接windows下的redis服务器1、确保redis服务器是启动状态2、创建连接打开如下页面:3、使用命令窗口右键点击localhost,选择Console正常使用各种redis命令三...
1 安装redis brew install redis
 启动redisredis-server
2 安装两个间件npm i koa-generic-session koa-redis
用来连接koaredis
用来操作session
3. 在app.js设置如下:
const session = r...
# 添加NodeSource APT存储库和用于验证软件包的PGP密钥
echo "add NodeSource APT is PGP"
sudo apt install apt-transport-https curl c