目录:redis
1、介绍数据库
2、缓存问题缓存
3、Redis内存滥用安全
4、键命名规范服务器
5、Redis使用场景数据结构
6、持久化操做并发
7、.Net Core 使用redis 简单介绍app
1、介绍ide
一、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距离系统更近、数据存储在内存中、采用了epoll,非阻塞I/O,工具
二、 原子性-- Redis的全部操做都是原子性的
三、 特性—可设置过时键、支持publish/subscribe发布与订阅、通知等
四、 数据类型—支持String(字符串)、Hash(哈希)、List(列表)、Set(集合)、 ZSet(有序集合)、Bitmaps(位图)、HyperLogLog、Geo(地理信息定位)
五、 服务器简单—底层代码简单优雅、不依靠操做系统类库、单线程模型,避免并发问题
六、 支持持久化—RDB、AOF
2、缓存问题
缓存的更新客区分为三种方式—主动更新,被动更新,预加载更新
主动更新—开发人员操做更新或者经过定时任务自动更新
被动更新—当用户操做触发时进行数据缓存更新
预加载更新—经过后台去点击查找最新的数据进行覆盖和删除
3、Redis内存滥用
缘由:
一、 数据一直累加,没有自动清除也没有手动清除,数据冗余
二、 储存没用的数据过多,有些可能只用到一个字段却储存了一个对象
三、 冷数据,根本不会用到的数据没有去管理和清理
解决:
一、 每次存储数据加上过时时间
二、 按期查看是否存在冷数据进行清除
三、 存储对应数据,不该肆意存储数据。存储可用到的数据
四、 存储的数据尽可能从简,简化存储的数据
4、键命名规范
一、 redis是非关系型数据库,内存存储数据,键名长度也会影响空间,尽可能控制键名长度
二、 可考虑大小写命名规范,根据业务命名,可加前缀,通俗易懂
5、Redis使用场景
一、 最主要用途可作缓存
二、 用redis的有序集合数据结构可作排行榜(ZSet)
三、 频繁读取数据库会形成数据库的巨大的压力均可以采用redis(浏览量、在线人数、等等)
四、 publish/subscribe发布与订阅可作简单的消息队列
6、持久化操做
持久化操做分为两种:RDB与AOF持久化
RDB:
一、 效率更高
二、 性能最大化,由于开始持久化的时候是fork出一个子进程,而后子进程去完成持久化的工做
三、 会将数据都存储在一个文件当中
持久化的配置
#持久化时间策略 save 900 1 #在900s至少有一条写入就会触发一次快照也就是一次备份 save 300 10 #300s内至少有10条写入就会产生快照 save 60 10000 #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:
一、 三种持久化的策略:一、修改同步二、每秒同步三、不一样步。
二、 写入操做采用的是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-percentage 100 auto-aof-rewrite-min-size 64mb #加载aof时有错是否继续加载,碰见错误会写入一个log而后继续执行,若是是no的话会终止执行 aof-load-truncated yes
定时任务:
# The range is between 1 and 500, however a value over 100 is usually not # a good idea. Most users should use the default of 10 and raise this up to # 100 only in environments where very low latency is required. hz 10
表示1s内执行10次,可设置1-500之间的数字,一般超过100不是好的想法,100的设置只适合很是低延迟的环境。
7、.Net Core 使用redis 简单介绍
一、引用包 StackExchange.Redis
二、创建一个Redis管理连接类
public class RedisManager { static RedisManager() { if (!string.IsNullOrEmpty(redis链接字符串)) redisHelp = new RedisHelp(redis链接字符串); } public static RedisHelp redisHelp { get; set; } }
三、创建一个Redis帮助类
public class RedisHelp { private ConnectionMultiplexer redis { get; set; } private IDatabase db { get; set; } public RedisHelp(string connection) { redis = ConnectionMultiplexer.Connect(connection); } /// <summary> /// 增长/修改string 字符串类型 /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> public bool SetValue(string key, string value,int timeSpan=0,int indexDb = 0) { var db = redis.GetDatabase(indexDb); //var a = TimeSpan.Parse(timeSpan.ToString()); var result= db.StringSet(key, value); if (timeSpan>0) { db.KeyExpire(key, DateTime.Now.AddSeconds(timeSpan)); } return result; } /// <summary> /// 查询 字符串类型 /// </summary> /// <param name="key"></param> /// <returns></returns> public string GetValue(string key, int indexDb = 0) { var db = redis.GetDatabase(indexDb); return db.StringGet(key); } /// <summary> /// 删除 /// </summary> /// <param name="key"></param> /// <returns></returns> public bool DeleteKey(string key, int indexDb = 0) { var db = redis.GetDatabase(indexDb); return db.KeyDelete(key); } /// <summary> /// 键是否存在 /// </summary> /// <param name="key"></param> /// <param name="indexDb"></param> /// <returns></returns> public bool KeyExist(string key,int indexDb=0) { var db = redis.GetDatabase(indexDb); var result = 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> public void HashSetString(string key, string field, string value, int timeSpan = 0, int indexDb = 0) { var db = 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> public string HashGetString(string key, string field, int indexDb = 0) { var db = redis.GetDatabase(indexDb); if (!string.IsNullOrWhiteSpace(key)&&!string.IsNullOrWhiteSpace(field)) { RedisValue result = db.HashGet(key, field); if (!string.IsNullOrWhiteSpace(result)) { return result; } } return string.Empty; } /// <summary> /// 删除哈希 /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="indexDb"></param> /// <returns></returns> public bool DeleteHash(string key, string field, int indexDb = 0) { var db = redis.GetDatabase(indexDb); return db.HashDelete(key,field); } }