Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)...
1.NOSQL简介
nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充。
Facebook和360使用Cassandra来存储海量社交数据
Twitter在其url抓取系统里综合运用了Cassandra、memcached
新浪微博使用Redis
淘宝使用hbase,并改进研制出自己品牌的nosql产品Oceanbase
mongodb被广泛用于存储非结构化数据
memcachedb是新浪网基于memcached开发的一个开源项目。给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制
和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,
但是 不需要严格事务约束,能够被持久化保存的应用场景。例如,memcachedb被应用在新浪博客上。如果对memcached有持久化需求,
可以考虑使用memcachedb。
2.非关系型的特点
(1)数据模型比较简单
(2)对数据库性能要求较高
(3)不需要高度的数据一致性
(4)对于给定的key,比较容易映射复杂值的环境
2.Redis简介
Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同)。
redis目前提供五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(sorted set) (有序集合)
3.Redis与Memcached的比较
(1)Memcached是多线程,而Redis使用单线程.
(2)Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
(3)Redis可以实现持久化,主从复制,实现故障恢复。
(4)Memcached只是简单的key与value,但是Redis支持数据类型比较多。
(5)Redis的存储分为内存存储、磁盘存储 .从这一点,也说明了Redis与Memcached是有区别的。Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
3.Redis存储方式
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘中来保证持久化。
Redis支持两种持久化方式.
(1):snapshotting(快照) rdb 也是默认方式.(把数据做一个备份,将数据存储到文件)
(2)Append-only file(缩写aof)的方式
快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写到二进制文件中,默认的文件名称
为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key
键修改就自动做快照.
aof方式:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次
快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的
写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建
整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。真阳aof方式的持久化
也还是有可能会丢失部分修改。可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘
的时机。
4.redis的应用场景
1.redis最佳使用场景是全部数据加载到内存中使用
2.redis更多场景是作为memcached的替代品来使用
3.数据比较重要,对数据一致性有一定的要求的业务
4.当需要除key/value之外的更多数据类型支持时,使用redis更合适
5.需要提供主从同步以及负载均衡分布式应用的场景(redis主从同步)
比如:计数、缓存服务、展示最近、最热、点击率最高、活跃度最高等条件的top list、用户最近访问记录、相关列表、消息队列、
粉丝列表、商品分类。
redis在微博中的应用
应用场景:
计数器
微博(评论、转发、阅读、赞等)
用户(粉丝、关注、收藏、双向关注等)
好友关系
5.redis的生产经验教训
1.要进行主从同步配置,在出现服务故障时可以切换
2.在master禁用数据持久化,只需在slave上配置数据持久化。
3.物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉,这个情况就是灾难。最少64-128G内存,SSD硬盘。
4.当redis物理内存使用超过内存总容量的3/5就会开始比较危险了,就开始做swap,内存碎片大。
5.当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间
6.redis和db同步写的问题,先写db,后写redis,因为写内存基本上没有问题。
redis 默认有16个库,从0开始,使用select 1 命令切换到第二个库
使用help命令查看帮助命令,help @string 查看所有string类型的,help set 查看set命令
6.redis安全
我们找到redis.conf中# requirepass foobared 设置密码requirepass 123456
使用auth 123456命令后可以进入
C:\Users\yuxl>redis-cli
127.0.0.1:6379> set key 1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
也可以使用这种方式
C:\Users\yuxl>redis-cli -a 123456
127.0.0.1:6379> set key1 1
OK
别的安全措施可以在redis.conf中将命令改名字或者禁用,找到# rename-command CONFIG "",比如rename-command get myget 将get命令改为myget
7.关于redis key的几条建议
1.太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
2.太短的键值通常也不是好主意,不易阅读,对内存消耗影响不是很大
坚持一种模式。如:“object-type:id:field”,“user:1000:password”,我喜欢对多单词的字段名中加上一个点,就像这样:comment:1234:reply.to,长度10-20,value建议string不必要超过2k,set sortedset不必要超过5000个元素
8.Redis安装
最新下载地址:https://github.com/ServiceStack/redis-windows
下载Redis:https://github.com/MicrosoftArchive/redis/releases
redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询.
redis-cli.exe: 服务端开启后,我们的客户端就可以输入各种命令测试了
class Program{static void Main(string[] args){RedisClient redisClient = new RedisClient("127.0.0.1",6379);#region 存储字符串类型和自定义类型//redisClient.Set<string>("name", "yxl");//Console.WriteLine(redisClient.Get<string>("name"));//UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };// (底层使用json序列化)//redisClient.Set<UserInfo>("userInfo", userInfo);//UserInfo user = redisClient.Get<UserInfo>("userInfo");//Console.WriteLine(user.UserName);//List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } };//redisClient.Set<List<UserInfo>>("list", list);//List<UserInfo> userInfoList = redisClient.Get<List<UserInfo>>("list");//foreach (UserInfo item in userInfoList)//{// Console.WriteLine(item.UserName);//}#endregion#region Hash// redisClient.SetEntryInHash("userInfoId", "name", "yxlhashName");// redisClient.SetEntryInHash("userInfoId", "name2", "yxlhashName");// List<string> hashKeys = redisClient.GetHashKeys("userInfoId");//List<string> hashValues = redisClient.GetHashValues("userInfoId");//long hashCount = redisClient.GetHashCount("userInfoId");// Console.WriteLine(hashCount);//2// foreach (string hashKey in hashKeys)// {// Console.WriteLine(hashKey);//name,name2// }// foreach (string hashValue in hashValues)// {// Console.WriteLine(hashValue);//yxlhashName,yxlhashName// }#endregion#region List类型#region 队列,先进先出//redisClient.EnqueueItemOnList("name1", "zhangsan");//redisClient.EnqueueItemOnList("name1", "lisi");//long length = redisClient.GetListCount("name1");//for (int i = 0; i < length; i++)//{// Console.WriteLine(redisClient.DequeueItemFromList("name1"));//}#endregion#region 栈,先进后出//redisClient.PushItemToList("name1", "zhangsan");//redisClient.PushItemToList("name1", "lisi");//long length = redisClient.GetListCount("name1");//for (int i = 0; i < length; i++)//{// Console.WriteLine(redisClient.PopItemFromList("name1"));//}#endregion#endregion#region Set类型,无序集合,集合我们可以取并集,交集,差集.#region 普通存储//redisClient.AddItemToSet("a3", "ddd");//redisClient.AddItemToSet("a3", "ccc");//redisClient.AddItemToSet("a3", "tttt");//redisClient.AddItemToSet("a3", "sssh");//redisClient.AddItemToSet("a3", "hhhh");//System.Collections.Generic.HashSet<string> hashset = redisClient.GetAllItemsFromSet("a3");//foreach (string str in hashset)//{// Console.WriteLine(str);//}#endregion#region 取并集//redisClient.AddItemToSet("a3", "ddd");//redisClient.AddItemToSet("a3", "ccc");//redisClient.AddItemToSet("a3", "tttt");//redisClient.AddItemToSet("a3", "sssh");//redisClient.AddItemToSet("a3", "hhhh");//redisClient.AddItemToSet("a4", "hhhh");//redisClient.AddItemToSet("a4", "h777");//System.Collections.Generic.HashSet<string> hashset = redisClient.GetUnionFromSets(new string[] { "a3", "a4" });//foreach (string str in hashset)//{// Console.WriteLine(str);//}#endregion#region 取交集//redisClient.AddItemToSet("a3", "ddd");//redisClient.AddItemToSet("a3", "ccc");//redisClient.AddItemToSet("a3", "tttt");//redisClient.AddItemToSet("a3", "sssh");//redisClient.AddItemToSet("a3", "hhhh");//redisClient.AddItemToSet("a4", "hhhh");//redisClient.AddItemToSet("a4", "h777");//System.Collections.Generic.HashSet<string> hashset = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" });//foreach (string str in hashset)//{// Console.WriteLine(str);//}#endregion#region 取差集//redisClient.AddItemToSet("a3", "ddd");//redisClient.AddItemToSet("a3", "ccc");//redisClient.AddItemToSet("a3", "tttt");//redisClient.AddItemToSet("a3", "sssh");//redisClient.AddItemToSet("a3", "hhhh");//redisClient.AddItemToSet("a4", "hhhh");//redisClient.AddItemToSet("a4", "h777");//System.Collections.Generic.HashSet<string> hashset = redisClient.GetDifferencesFromSet("a3",new string[] { "a4" });////返回存在于第一个集合(a3),但是不存在于其他集合(a4)的数据//foreach (string str in hashset)//{// Console.WriteLine(str);//}#endregion#endregion#region Sorted Set类型//redisClient.AddItemToSortedSet("a5", "ffff");//redisClient.AddItemToSortedSet("a5", "bbbb");//redisClient.AddItemToSortedSet("a5", "gggg");//redisClient.AddItemToSortedSet("a5", "cccc");//redisClient.AddItemToSortedSet("a5", "waaa");//System.Collections.Generic.List<string> list = redisClient.GetAllItemsFromSortedSet("a5");//foreach (string str in list)//{// Console.WriteLine(str);//}#endregion}public class UserInfo{public string UserName { get; set; }public string UserPwd { get; set; }}}
转载于:https://www.cnblogs.com/yxlblogs/p/3791307.html
Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)...相关推荐
- MySQL的存储引擎及常用数据类型介绍
1. MySQL中的数据库分类 2. MySQL中的存储引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供不同 ...
- Redis简介、特性、优势、应用场景和nosql介绍
1. nosql介绍 NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 [不需要分析表与表之间的关系] 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全 ...
- redis中几种数据存储方式的比较
2019独角兽企业重金招聘Python工程师标准>>> 这是慕课网一门课程的提问,有一个回答很不错,我就摘抄过来了.链接 原问题: 为什么不用redis的hash来存储对象? 二进制 ...
- 使用redis作为Return存储方式
Return组件可以理解为SaltStack系统对执行Minion返回后的数据进行存储或者返回给其他程序,它支持多种存储方式,比如MySQL.Redis.Memcache等,通过Return我们可以对 ...
- 图的存储方式 // oj3116 oj3117 oj3118 oj3467
图的简介及图的存储方式 // 博客 邻接表实现过程 // b站视频 邻接表与链式前向星的区别 // 博客 使用c++时ios :: sync_with_stdio(false);//加快cin流速: ...
- Oracle 数据类型及存储方式(袁光东 原创)
概述 通过实例,全面而深入的分析oralce 10G的基本数据类型及它们的存储方式.从实用和优化的角度出发,讨论每种数据类型的特点.从这里开始oracle之旅! 第一部份 字符类型 §1.1 char ...
- 金融系统中正确的金额计算及存储方式
转载自 金融系统中正确的金额计算及存储方式 经典的精度丢失问题 Java中的类型float.double用来做计算会有精度丢失问题,下面来看下面的示例. public static void main ...
- redis hash 储存mysql_Redis系列-存储hash主要操作命令
Redis系列-存储篇hash主要操作函数小结 hash是一些列key value(field value)的映射表.常常用其存储一些对象实例.相对于把一个对象的各个字段存储为string,存储为ha ...
- 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】
这是我的作业题,作业写完后再附到博客中,可能代码写得很烂.虽然是C语言写的,但是我在其中加入了C++的写法,例如cout.我懒得写printf的格式控制符,所以用cout来输出内容,这样我感觉简便多了 ...
最新文章
- 何恺明等人新作:效果超ResNet,利用NAS方法设计随机连接网络 | 技术头条
- 【PDF下载】无意中发现的另一本 统计学入门好书
- spring boot 异常(exception)处理
- 不同编程语言的取模运算%
- 编程思考:对象生命周期的问题
- ES6第一节:开发环境的搭建
- 卖萌屋新闻联播栏目,倾情上线~
- javascript 键值转换
- PID参数整定法(1)
- Windows 2016 减肥
- 完美卸载SQL Server 2008的方案
- 图文演示通过虚拟打印机生成pdf的使用技巧
- 利用Windows注册Dll或其他文件
- 基于WiEngine游戏引擎的Sample
- NPOI导出Excel自适应行高
- DNS隧道通信的检测
- index.php.bak 颓废_CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现
- 要想数组用的 6,怎能不懂 java.util.Arrays
- 跨越40年的甲骨文公司,正在成为年轻一代的时尚选择
- 小红书种草和小红书种草笔记