@H_403_0@############################################### @H_403_0@任何一个领域,如果不能通过自己的努力 @H_403_0@去获取或者超出其他人的竞争优势的话 @H_403_0@想胜出,确实挺困难的!!! @H_403_0@################################################ @H_403_0@
@H_403_0@关系型数据库:
关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名。
元组:可以理解为二维表中的一行,在数据库中经常被称为记录。
关键字:一组可以唯一标识元组的属性。数据库中常称为主键,由一个或多个列组成。
关系模式:指对关系的描述,其格式为:关系名(属性1,属性2,…,属性N)。在数据库中通常称为表结构。
@H_403_0@Nosql版本 @H_403_0@存储方式不一样 @H_403_0@Redis @H_403_0@存在缓存中 @H_403_0@很稳定资格较老,成熟方案较多 @H_403_0@mongoDB @H_403_0@存在文件中 @H_403_0@社区活跃,更新活跃 @H_403_0@HBASE @H_403_0@memcached:数据只保存在缓存中 @H_403_0@cassandra @H_403_0@sequoiaDB:只跟ibm捆绑 @H_403_0@redis @H_403_0@通过键值存储数据 @H_403_0@键值对应数据如变量 @H_403_0@nosql和关系式数据库配合使用 @H_403_0@Memcache @H_403_0@速度较快、不能备份、支持十几万QPS @H_403_0@(对一个服务器在一个时间范围内处理 @H_403_0@的数据量的多少) @H_403_0@MONGODB @H_403_0@文档型的数据库,查询功能强大,支持 @H_403_0@索引,最接近关系式数据库的nosql @H_403_0@结构相对单一 @H_403_0@REDIS @H_403_0@基于缓存,速度较快,支持多种数据结构 @H_403_0@消耗内存相对较多,支持数万的QPS @H_403_0@通过其他软件配合支持本地存储 @H_403_0@Redis安装配置: @H_403_0@1:安装gcc* @H_403_0@/usr/src/ @H_403_0@Redis-3.0.3.tar.gz @H_403_0@Tcl-8.5.7-6.e16.x86 @H_403_0@Tar �Czxvf redis-3.03 @H_403_0@Cd redis-3.03 @H_403_0@Make @H_403_0@Rpm �Civh Tcl-8.5.7-6.e16.x86 @H_403_0@make test @H_403_0@make PREFIX=/usr/local/redis install @H_403_0@redis-check-aof @H_403_0@redis-check-dump @H_403_0@以上为两种日志 @H_403_0@ @H_403_0@ @H_403_0@ @H_403_0@Cd!$ @H_403_0@Vim redis.config @H_403_0@/daemonize @H_403_0@Daemonize yes后台运行 @H_403_0@ @H_403_0@ @H_403_0@如果我想看一下数据库里有什么键值 @H_403_0@Keys * @H_403_0@Set age 19 @H_403_0@Set设置 @H_403_0@Get查看 @H_403_0@测试指定的并发类型 @H_403_0@ @H_403_0@官方网站:http://www.redis.cn/ @H_403_0@Redis.io @H_403_0@String字符串 @H_403_0@String字符串在一个键里面只能有一个值 @H_403_0@Set设置键 @H_403_0@Get查看键 @H_403_0@./redis-cli @H_403_0@防止覆盖: @H_403_0@Setnx name zhangsan @H_403_0@显示为0不成功 @H_403_0@Setnx name1 zhangsan @H_403_0@显示为1则成功创建 @H_403_0@Setex aa 30 111设置临时的键 @H_403_0@Ttl aa查看生存周期 @H_403_0@-1为永久生效 @H_403_0@-2目标键为不存在 @H_403_0@Hexists c b3 @H_403_0@批量设置多个键: @H_403_0@MSET a3 333 a4 444 a5 555 @H_403_0@成功返回ok,失败返回0 @H_403_0@mget批量查看键 @H_403_0@msetnx批量设置新建,防止覆盖 @H_403_0@MSETNX a5 555 a6 aaa @H_403_0@替换操作 @H_403_0@Set b1 ‘hi zhangsan’ @H_403_0@Get b1 @H_403_0@替换指定键的键值从3里面开始替换 @H_403_0@SETRANGE b1 3 lisi @H_403_0@ (替换的内容) @H_403_0@Get b1查看原值,并替换新值 @H_403_0@整个内容替换成别的值并可以查看原来的值 @H_403_0@Getset b1‘hello zhangsan’查看新值并替换新值 @H_403_0@Getrange b1 0 5查看部分键值 @H_403_0@查找第一个到第五个字符 @H_403_0@键值增减 @H_403_0@Set c1 1 @H_403_0@Set c2 2 @H_403_0@Get c1 @H_403_0@INCR c1 @H_403_0@以上会发生增加变化如果不想让他加1 yici加10 @H_403_0@INCRBY c1 +10 (必须为整数)则依次增长10 @H_403_0@ @H_403_0@DECRBY c1 10则每次执行依次减10 @H_403_0@APPEND b1 lisi追加内容为lisi四个字符 @H_403_0@Strlen b1查看键值长度 @H_403_0@Del b1删除b1只能一次删除一个 @H_403_0@Hash字符串 @H_403_0@在一个键里面可以有多个值 @H_403_0@ @H_403_0@Hset d1 name1 zhangsan创建一个为hash字段 @H_403_0@键名字段键值 @H_403_0@HGET d1 name1查看d1键名中name1字段值 @H_403_0@一个键里面存放两组数据 @H_403_0@Hsetnx设置新建防止它覆盖 @H_403_0@HSETNX d1 name3 xxx1为成功 @H_403_0@Hmget d1 name1 name2 name3批量查看字段的值 @H_403_0@Hkeys查看指定键中的字段名称: @H_403_0@HKEYS d1只查看名字 @H_403_0@Hgetall查看指定键的值 @H_403_0@HDEL d1 name3删除指定字段 @H_403_0@Hset d2 a 1 @H_403_0@字段名a数值1 @H_403_0@Hkeys d2 @H_403_0@Hincrby d2 a 5增加指定字段的值 @H_403_0@List双向队列 @H_403_0@双向队列就是一种特殊的string类型 @H_403_0@只是做了一个排序有一个前后顺序 @H_403_0@ @H_403_0@服务在建立连接的时候有个队列 @H_403_0@如何将这些消息排成一列进行管理 @H_403_0@有一个先后顺序服务质量 @H_403_0@队列里的每一个数据就可以看成一个string数据类型 @H_403_0@有两种排列顺序一种是从左到右0 1 2 3 @H_403_0@一种是从右到左-1 -2 -3 @H_403_0@ 0 1 2 3个数据 @H_403_0@Lpush list1 1从左往右插入 @H_403_0@Lpush list1 2 @H_403_0@Lrange list1 0 -1查看从左边第一个到右边第一个 @H_403_0@Rpush list2 one two three four从右往左插入 @H_403_0@Lrange list2 0 -1查看 @H_403_0@Linsert list2 before two 3 hi @H_403_0@ After (在之后) @H_403_0@插入到队列lisi2中在two之前插入了hi @H_403_0@ @H_403_0@Lset list2 1‘five’在list2中从左往右第二个位置把hi改为five @H_403_0@Rpush list3 hi 1 hi 2 hi 3 hi 4 @H_403_0@Lrange list3 0 -1查看总共八个元素 @H_403_0@Lrem list3 -2 hi删除指定队列中重复的元素 @H_403_0@把倒数第一个第二个给删除 @H_403_0@Lrange list1 0 -1查看 @H_403_0@Ltrim list1 1 2删除list1表里面第1个第2个 @H_403_0@Lrange list1 0 -1查看已经删除 @H_403_0@Lpush list8 11 12 13 14 15 16新建队列 @H_403_0@Ltrim list8 0 3保留前三个 @H_403_0@Lrange list8 0 -1查看所有 @H_403_0@Lpop list8 删除指定队列中左边的第一个元素 @H_403_0@Rpop list8删除指定队列中右边的第一个元素
如果我想删除的同时还能够把这个
元素放到其他队列里
Lrange list8 0 -1
Lrance list2 0 -1
@H_403_0@Rpoplpush list8 list2将list8队列中的最后一个元素 @H_403_0@移动到list2队列中 @H_403_0@Llen查看队列长度 @H_403_0@Lien list2 1通过下标来查看队列中元素的值 @H_403_0@Lindex list2 0 @H_403_0@Zset有序集合 @H_403_0@Sorted set(zset)是set的升级版本, @H_403_0@它在的基础上增加了一个顺序属性,每次指定后,会自动重新按新得值调整顺序。
可以理解为有两列的MysqL表,
一列存value,一列存顺序。操作中key理解为的名字。
@H_403_0@Set @H_403_0@ @H_403_0@如qq中的好有推荐 @H_403_0@值分数下标 @H_403_0@Sadd q1 1添加集合 @H_403_0@Smembers q1查看集合所有元素 @H_403_0@Sadd q1 234 @H_403_0@Srandmember q1随机调用值 @H_403_0@Spop q1随机删除一个值 @H_403_0@Srem q1 4指定随机删除一个值 @H_403_0@Scard q1查看总共有几个元素 @H_403_0@Sismember q1 3查看3是否为集合里的元素 @H_403_0@Sadd q2 1 2 3 4 @H_403_0@Sadd q3 3 4 5 6 @H_403_0@Sdiff q2 q3查看查集以第一个指定集合为主 @H_403_0@Sdiffstore q4 q3 q2查看并把q3 q2集合写入q4 @H_403_0@Smembers q4 @H_403_0@Smembers q2查看集合中所有元素 @H_403_0@Smembers q3 @H_403_0@Sinter q2 q3查看交集 @H_403_0@Sinterstore q8 q2 q3需要有一样的才能保存到新集合 @H_403_0@查看交集并保存到新集合 @H_403_0@Sunion q2 q3查看并集 @H_403_0@Sunionstore q9 q2 q3 @H_403_0@Smove q2 q3 1先写源集合在写目标集合把q2的值移动到q3中 @H_403_0@移动集合中的元素 @H_403_0@有序集合:比原来的集合多一个分数 @H_403_0@能够实现实时同步 @H_403_0@Zadd z1 1 aa 3 bb 2 cc 2 dd @H_403_0@Zrange z1 0 -1分数是按照从小到大的排序 @H_403_0@查看集合内元素 @H_403_0@Zrange z1 0 -1 withscores分数是按照从小到大的排序 @H_403_0@Zrevrange z1 0 -1 withscores @H_403_0@会按照分数从大到小排列 @H_403_0@Zrangebyscore z1 2 3 withscores @H_403_0@查看分数从2到3的 @H_403_0@Zrem z1 dd @H_403_0@删除值 @H_403_0@Zincrby z1 5 aa @H_403_0@Zincrby z1 4 dd创建出来并把分数设为4 @H_403_0@添加分数如不存在则创建 @H_403_0@Zrange z1 0 -1 withscores @H_403_0@Zrank z1 aa @H_403_0@按照分数从小到大的顺序获取指定值的下标 @H_403_0@Zrevrank z1 aa按照分数从小到大顺序获取指定值的下标 @H_403_0@Zcard z1统计集合中元素个数 @H_403_0@Zcount z1 4 10统计指定分数范围内的元素个数 @H_403_0@Zrank z1 cc @H_403_0@Zremrangebyrank z1 1 2删除了bb和dd @H_403_0@删除下标在指定范围内的元素 @H_403_0@Zremrangebyscore z1 1 3 @H_403_0@根据分数来删除1到3之间的 @H_403_0@删除分数在指定范围内的元素 @H_403_0@Zadd z2 1 one 2 two 3 three @H_403_0@Zadd z3 2 two 3 three 3 four @H_403_0@Zinterstore z4 2 z2 z3做交集 @H_403_0@用z4做集合、有两个分别是z2、z3 @H_403_0@Zrange z4 0 -1查看他们的交集是对了两边都有 @H_403_0@Zrange z4 0 -1 withscores取交集并保存至新集合 @H_403_0@有序集合取出以后分数是要叠加的 @H_403_0@在有序集合里插集无意义因为没有那个命令 @H_403_0@并集: @H_403_0@Zrange z2 0 -1 withscores创建one1 two2 three3 @H_403_0@Zrange z3 0 -1 withscores创建two2 three3 four4 @H_403_0@Zunionstore z5 2 z2 z3取并集并保存至新集合(分数叠加) @H_403_0@Zrange z5 0 -1 withscores查看新集合 @H_403_0@ @H_403_0@全局的管理命令 @H_403_0@Keys * @H_403_0@Dbsize统计键的数量 @H_403_0@Exists a2查看某个键是否存在0不存在1存在 @H_403_0@ -1永久-2临时 @H_403_0@Ttl a2 @H_403_0@Expire q4 20可以设置为生效时间的键 @H_403_0@设置q4有效时间为20秒 @H_403_0@Ttl q4会有变化 @H_403_0@Rename d1 d2改名将d1改为d2 @H_403_0@Type a1查看键的数据类型 @H_403_0@(如string list set zset) @H_403_0@Info查看版本信息 @H_403_0@Select 1选择去哪一个数据库默认为0数据库 @H_403_0@一共有0-15 16个数据库 @H_403_0@Move d2 1把一个键移动到其他数据库中 @H_403_0@在当前数据库中就无法看到d2啦! @H_403_0@Select 1到1数据库里就可以看到啦! @H_403_0@Flushdb清空当前数据库 @H_403_0@Flushall清空所有数据库(16个数据库里变量) @H_403_0@数据库应用 @H_403_0@ @H_403_0@密码验证: @H_403_0@Yum �Cy install gcc* @H_403_0@ @H_403_0@ @H_403_0@ @H_403_0@make @H_403_0@make test @H_403_0@ @H_403_0@Cd /usr/local/redis @H_403_0@ @H_403_0@Vim redis.conf打开主配置文件 @H_403_0@Daemonizeyes设置为后台启动 @H_403_0@启动redis @H_403_0@小P登入 @H_403_0@/requirepass搜索 @H_403_0@Requirepass 123.com去掉注释写入密码 @H_403_0@Wq! @H_403_0@Pkill redis重启一下redis @H_403_0@./bin/redis-server ./redis.conf @H_403_0@./bin/redis-cli登入 @H_403_0@Keys *会看不到任何的内容 @H_403_0@Auth 123.com需要提供认证认证 @H_403_0@或者登入的时候加选项指定密码�Ca 123.com @H_403_0@备份: @H_403_0@Nosql是能保存数据的nosql @H_403_0@是怎样来保存的! @H_403_0@/usr/local/redis/bin/redis-server空格 @H_403_0@/usr/local/redis/redis.conf开启服务 @H_403_0@以上为一行 @H_403_0@/usr/local/redis/bin/redis-cli �Ca 123.com登入 @H_403_0@Keys *就能看到啦 @H_403_0@Save保存 @H_403_0@Exit @H_403_0@Pkill redis @H_403_0@Cd /root/ @H_403_0@/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf @H_403_0@/usr/local/redis/bin/redis-cli �Ca 123.com @H_403_0@Keys *为空的! @H_403_0@Vim /usr/local/redis/redis.conf @H_403_0@/dir @H_403_0@/usr/local/redis(修改以前为dir ./) @H_403_0@开启 @H_403_0@/usr/local/redis/bin/redis-cli -a 123.com登入 @H_403_0@Keys *就会看到有不用去配置文件找 @H_403_0@主从同步: @H_403_0@实验需求:一台服务器上做主从 @H_403_0@需要在一台服务器上创建两个工作目录 @H_403_0@MysqL MysqLd @H_403_0@1从:从服务器的配置(一台服务器上) @H_403_0@Cd /usr/local/redis/进入工作目录 @H_403_0@Ls会看到主配置文件redis.conf @H_403_0@Cd /usr/local/ @H_403_0@Cp -r redis/ redis-slave/ @H_403_0@Ls就会有两个工作目录 @H_403_0@Vim redis-slave/redis.conf @H_403_0@Pidfile /usr/local/redis-slave/redis.pid修改为这个文件 @H_403_0@Port 6380改端口 @H_403_0@dir /usr/local/redis-slave (修改以前为dir ./) @H_403_0@/slaveof查找/ @H_403_0@slaveof 127.0.0.1 6379主服务器ip、端口 @H_403_0@masterauth 123.com @H_403_0@wq! @H_403_0@/usr/local/redis-slave/bin/redis-server空格 @H_403_0@/usr/local/redis-slave/redis.conf @H_403_0@以上两行为一行 @H_403_0@netstat -anpt查看端口有6380 6379 @H_403_0@验证登入主服务器(在一台机器上做) @H_403_0@/usr/local/redis/bin/redis-cli �Ca 123.com @H_403_0@Keys *有变量 @H_403_0@Set bb 111创建一个bb @H_403_0@用从服务器登入 @H_403_0@ @H_403_0@ Keys * @H_403_0@看到bb则代表创建成功 @H_403_0@如果是在两台服务器上搭建则只需要 @H_403_0@从服务器主配置文件里从服务器的ip地址指到主就行 @H_403_0@Redis的五种数据结构以及使用场景介绍 @H_403_0@String――字符串Hash――字典
List――列表
Set――集合
Sorted Set――有序集合 @H_403_0@
1.String――字符串
String数据结构是简单的key-value类型,value不仅可以是,也可以是数字(当数字类型用Long可以表示的时候encoding就是整型,其他都存储在sdshdr当做字符串)。使用Strings类型,可以完全实现目前Memcached的功能,并且效率更高。还可以享受Redis的定时持久化(可以选择RDB模式或者AOF模式),操作日志及Replication等功能。除了提供与一样的get、setincrdecr等操作外,还提供了下面一些操作:
1.LENniushuai:O(1)获取字符串长度
2.APPENDniushuairedis:往字符串append内容,而且采用智能分配内存(每次2倍)
3.设置和获取字符串的某一段内容
4.设置及获取字符串的某一位(bit)
5.批量设置一系列字符串的内容
6.原子计数器
7.GETSET命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用
1.Hash――字典
在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串()取出来,然后进行反序列化,修改某一项的值,再序列化成字符串()存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。
存储、读取、修改用户属性
1.List――列表
List说白了就是链表(redis使用双端链表实现的List),相信学过数据结构知识的人都应该能理解其结构。使用结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的TimeLine)。的另一个应用就是消息队列,可以利用的*PUSH操作,将任务存在中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作中某一段元素的API,你可以直接查询,删除中某一段的元素
1.微博TimeLine
2.消息队列
Set――集合
Set就是一个集合,集合的概念就是一堆不重复值的组合。利用提供的Set数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
1.共同好友、二度好友
2.利用唯一性,可以统计访问网站的所有独立IP
3.好友推荐的时候,根据tag求交集,大于某个threshold就可以推荐
Sorted Set――有序集合
和Sets相比,Sorted Sets是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按进行有序排列,比如一个存储全班同学成绩的,其集合value可以是同学的学号,而就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用来做带权重的队列,比如普通消息的为1,重要消息的2,然后工作线程可以选择按的倒序来获取工作任务。让重要的任务优先执行。
1.带有权重的元素,比如一个游戏的用户得分排行榜
2.比较复杂的数据结构,一般用到的场景不算太多
二、其他功能使用场景
订阅-发布系统
Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在中,你可以设定对某一个key值进行消息发布及消息订阅,当一个值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。
2:事务――Transactions
谁说Nosql都不支持事务,虽然Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。还提供了一个Watch功能,你可以对一个进行,然后再执行,在这过程中,如果这个Watched的值进行了修改,那么这个会发现并拒绝执行。
原文链接:https://www.f2er.com/nosql/203669.html