美文网首页读书开发随笔
Redis介绍使用及进阶

Redis介绍使用及进阶

作者: 小世界的野孩子 | 来源:发表于2019-04-22 17:47 被阅读0次

目录:

一、介绍

二、缓存问题

三、Redis内存滥用

四、键命名规范

五、Redis使用场景

六、持久化操作

七、.Net Core 使用redis 简单介绍


一、介绍

1、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距离系统更近、数据存储在内存中、采用了epoll,非阻塞I/O,

2、 原子性--  Redis的所有操作都是原子性的

3、 特性—可设置过期键、支持publish/subscribe发布与订阅、通知等

4、 数据类型—支持String(字符串)、Hash(哈希)、List(列表)、Set(集合)、 ZSet(有序集合)、Bitmaps(位图)、HyperLogLog、Geo(地理信息定位)

5、 服务器简单—底层代码简单优雅、不依靠操作系统类库、单线程模型,避免并发问题

6、 支持持久化—RDB、AOF

二、缓存问题

缓存的更新客区分为三种方式—主动更新,被动更新,预加载更新

主动更新—开发人员操作更新或者通过定时任务自动更新

被动更新—当用户操作触发时进行数据缓存更新

预加载更新—通过后台去点击查找最新的数据进行覆盖和删除

三、Redis内存滥用

原因:

1、 数据一直累加,没有自动清除也没有手动清除,数据冗余

2、 储存没用的数据过多,有些可能只用到一个字段却储存了一个对象

3、 冷数据,根本不会用到的数据没有去管理和清理

解决:

1、 每次存储数据加上过期时间

2、 定期查看是否存在冷数据进行清除

3、 存储对应数据,不应肆意存储数据。存储可用到的数据

4、 存储的数据尽量从简,简化存储的数据

四、键命名规范

1、 redis是非关系型数据库,内存存储数据,键名长度也会影响空间,尽量控制键名长度

2、 可考虑大小写命名规范,根据业务命名,可加前缀,通俗易懂

五、Redis使用场景

1、 最主要用途可做缓存

2、 用redis的有序集合数据结构可做排行榜(ZSet)

3、 频繁读取数据库会造成数据库的巨大的压力都可以采用redis(浏览量、在线人数、等等)

4、 publish/subscribe发布与订阅可做简单的消息队列


六、持久化操作

持久化操作分为两种:RDB与AOF持久化

RDB:

1、 效率更高

2、 性能最大化,因为开始持久化的时候是fork出一个子进程,然后子进程去完成持久化的工作

3、 会将数据都存储在一个文件当中

持久化的配置

#持久化时间策略

save 9001  #在900s至少有一条写入就会触发一次快照也就是一次备份

save 30010  #300s内至少有10条写入就会产生快照

save 6010000  #60s内产生10000条写入就会产生快照

#如果持久化出错是否停止主进程的写入

stop-writes-on-bgsave-error yes

#是否压缩

rdbcompression yes

#导入时是否检查文件

rdbchecksum yes

#保存的文件的名称

dbfilename dump.rdb

#保存文件地址

dir ./

stop-writes-on-bgsave-error yes  --是一条很重要的命令,为了保证数据的完整性的

rdbcompression yes   没必要开启,开启会导致cpu的消耗。划不来,默认开启的

在时间策略上面还有一个#save "",这行命令被注释了,如果想要禁用RDB持久化就可以开启这条命令。

RDB持久化是默认开启的,而AOF是默认关闭的

AOF:

1、 三种持久化的策略:1、修改同步2、每秒同步3、不同步。

2、 写入操作采用的是append模式,即使在操作数据到一半系统崩溃的情况下也可在启动之前用redis-check-aof工具来完成数据的回复的一致性的问题。

#是否开启aof

appendonly no

#文件的名称

appendfilename "appendonly.aof"#同步方式

# appendfsync always    #修改了就同步,比较消耗性能,慢但安全

appendfsync everysec    #每秒同步一次,比较折中,默认开启,最多会损失1s的数据

# appendfsync no          #不开启同步,交给os处理,快但不安全

#aof重写期间是否同步

no-appendfsync-on-rewrite no

#重写触发的配置

auto-aof-rewrite-percentage100auto-aof-rewrite-min-size 64mb

#加载aof时有错是否继续加载,遇见错误会写入一个log然后继续执行,如果是no的话会终止执行

aof-load-truncated yes

       定时任务:

# The rangeisbetween1and500, however a value over100is usually not

# a good idea. Most users should use the defaultof10and raisethis up to

# 100onlyinenvironmentswherevery low latencyis required.

hz 10

表示1s内执行10次,可设置1-500之间的数字,通常超过100不是好的想法,100的设置只适合非常低延迟的环境。


七、.Net Core 使用redis 简单介绍

1、引用包  StackExchange.Redis

2、建立一个Redis管理链接类

publicclass RedisManager

    {

        static RedisManager()

        {

            if(!string.IsNullOrEmpty(redis连接字符串))

                redisHelp =new RedisHelp(redis连接字符串);

        }

        publicstaticRedisHelp redisHelp {get;set; }

    }

 

3、建立一个Redis帮助类

     publicclass RedisHelp

          {

        privateConnectionMultiplexer redis {get;set; }

        privateIDatabase db {get;set; }

        publicRedisHelp(string connection)

        {

            redis = ConnectionMultiplexer.Connect(connection);

        }

        ///<summary>/// 增加/修改string  字符串类型

        ///</summary>///<param name="key"></param>///<param name="value"></param>///<returns></returns>publicboolSetValue(stringkey,stringvalue,inttimeSpan=0,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            //var a = TimeSpan.Parse(timeSpan.ToString());varresult= db.StringSet(key, value);

            if(timeSpan>0)

            {

                db.KeyExpire(key, DateTime.Now.AddSeconds(timeSpan));

            }

            return result;

        }        ///<summary>///  查询  字符串类型

        ///</summary>///<param name="key"></param>///<returns></returns>publicstringGetValue(stringkey,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            return db.StringGet(key);

        }

      ///<summary>/// 删除

        ///</summary>///<param name="key"></param>///<returns></returns>publicboolDeleteKey(stringkey,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            return db.KeyDelete(key);

        }        ///<summary>/// 键是否存在

        ///</summary>///<param name="key"></param>///<param name="indexDb"></param>///<returns></returns>publicboolKeyExist(stringkey,intindexDb=0)

        {

            vardb = redis.GetDatabase(indexDb);

            varresult = db.KeyExists(key);

            return result;

        }

        ///<summary>/// 哈希写入字符串

        ///</summary>///<param name="key"></param>///<param name="field"></param>///<param name="value"></param>///<param name="timeSpan"></param>///<param name="indexDb"></param>publicvoidHashSetString(stringkey,stringfield,stringvalue,inttimeSpan =0,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            db.HashSet(key, field, value);

            if(timeSpan>0)

            {

                db.KeyExpire(key,DateTime.Now.AddSeconds(timeSpan));

            }

        }

        ///<summary>/// 获取哈希值(单个字符串类型)

        ///</summary>///<param name="key"></param>///<param name="field"></param>///<param name="indexDb"></param>///<returns></returns>publicstringHashGetString(stringkey,stringfield,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            if(!string.IsNullOrWhiteSpace(key)&&!string.IsNullOrWhiteSpace(field))

            {

                RedisValue result = db.HashGet(key, field);

                if(!string.IsNullOrWhiteSpace(result))

                {

                    return result;

                }

            }

            returnstring.Empty;

        }

        ///<summary>/// 删除哈希

        ///</summary>///<param name="key"></param>///<param name="field"></param>///<param name="indexDb"></param>///<returns></returns>publicboolDeleteHash(stringkey,stringfield,intindexDb =0)

        {

            vardb = redis.GetDatabase(indexDb);

            return db.HashDelete(key,field);

        }

}

相关文章

网友评论

    本文标题:Redis介绍使用及进阶

    本文链接:https://www.haomeiwen.com/subject/qlyugqtx.html