欢迎关注我的个人微信公众号,不定期AI论文解读与开发技术分享

NoSQL

NoSQL(Not Only SQL),即不仅仅是SQL,是一项全新的数据库概念,泛指非关系型数据库。

为什么需要NoSQL

  1. High Performance 对数据库高并发读写的需求;
  2. High Storage 对海量数据的高效率存储和访问的需求;
  3. High Scalability && High Availability 对数据库的高可扩展性和高可用性的需求;

NoSQL数据库的四大分类如下:

  • 键值(key-value)存储数据库: Redis
  • 列存储数据库:HBase
  • 文档型数据库:mongoDB
  • 图形数据库:Neo4J

NoSQL的特点:

  1. 易扩展 NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系性特征,数据之间并没有关系,这样就非常容易扩展;
  2. 大数据量,高性能 NoSQL数据库都具有非常高的读写性能,尤其是在大数据量下,同样表现优秀,这得益于它的无关系性。
  3. 灵活的数据模型 NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
  4. 高可用 NoSQL在不太影响性能的情况,可以方便的实现高可用的架构。

Redis

Redis是用C语言开发的一个开源的高性能键值对数据库,它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下: 1. 字符串类型;2. 散列类型;3. 列表类型;4. 集合类型;5. 有序集合类型;

Redis的安装

  • Redis在Linux上的安装
  • 安装redis编译的c环境,yum install gcc-c++;
  • 将redis-2.6.16.tar.gz上传到Linux系统中;
  • 解压到/usr/local下 tar -xvf redis-2.6.16.tar.gz -C /usr/local;
  • 进入redis-2.6.16目录 使用make命令编译redis;
  • 在redis-2.6.16目录中 使用make PREFIX=/usr/local/redis install命令安装redis到/usr/local/redis中;
  • 拷贝redis-2.6.16中的redis.conf到安装目录redis中;
  • 启动redis 在bin下执行命令redis-server redis.conf;
  • 如需远程连接redis,需配置redis端口6379在linux防火墙中开发;
    /sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT /etc/rc.d/init.d/iptables save

注意: 启动后看到如上欢迎页面,但此窗口不能关闭,窗口关闭就认为redis也关闭了(类似Tomcat通过bin下的startup.bat的方式)。

解决方案:可以通过修改配置文件 配置redis后台启动,即服务器启动了但不会创建控制台窗口将redis.conf文件中的daemonize从false修改成true表示后台启动:

修改redis.conf配置文件,daemonize yes以后端模式启动:

vim /usr/local/redis/redis.conf    daemonize yes

启动时,指定配置文件:

cd /usr/local/redis
./bin/redis-server ./redis.conf

Redis停止 * 强制结束程序,强行终止Redis进程可能会导致Redis持久化数据丢失

kill -9 进程号 # pid 需要通过“ps aux | grep -i redis” 进行查询

  • 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:
cd /usr/local/redis
./bin/redis-cli shutdown

Jedis入门

Java连接Redis

  1. 导入jar包
  1. 单实例连接
@Test
public void testJedisSingle(){// 设置ip地址和端口Jedis jedis = new Jedis("192.168.1.132", 6379);// 设置数据jedis.set("name", "super1peng");// 获取数据String name = jedis.get("name");System.out.println(name);// 释放资源jedis.close();
}

  1. 连接超时

如果运行上面的代码,抛出如下异常

redis.clients.jedis.exceptions.JedisConnectionException:
java.net.ScoketTimeoutException: connect time out

必须设置防火墙

vim /etc/sysconfig/iptables

service iptables restart

  1. 连接池连接
@Test
public void testJedisPool(){// 获得连接池配置对象,设置配置项JedisPoolConfig config = new JedisPoolConfig();// 设置最大连接数config.setMaxTotal(30);// 设置最大空闲连接数config.setMaxIdle(30);// 获得连接池JedisPool jedisPool = new JedisPool(config, "192.168.1.132", 6379);// 获得核心对象Jedis jedis = null;try{jedis jedisPool.getResource();jedis.set("name","super1peng");System.out.println(name);}catch (Exception e){e.printStackTrace();}finally{if(jedis != null){jedis.close();}if(jedisPool != null){jedis.close();}}
}

Redis数据结构

  • redis是一种高级的key-value的存储系统,其中value支持五种数据类型
  • 字符串(String);
  • 哈希(hash);
  • 字符串列表(list);
  • 字符串集合(set);
  • 有序字符串集合(sorted set);

存取String

  • set key value: 设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回OK;
  • get key: 获取key的value。如果与该key关联的valye不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)。
  • getset key value: 先获取该key值,然后再设置该key的值。
  • del key: 删除指定的key
  • incr key: 将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后,其数值为1.如果value的值不能转成整形,如hello,该操作将执行失败并返回错误信息。
  • decr key: 与incr key相反。
  • incrby key increment: 将指定的key的value原子性增加increment,情况与incr类似;
  • decrby key decrement: 与incrby类似
  • append key value: 拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value。

存储hash

Redis中的Hash类型可以看成具有String Field和String Value的map容器,所以该类型非常适合与存储值对象的信息。

  • hset key field value: 为指定的key设定field/value对(键值对)。
  • hmset key field value [field2 value2 ...]: 设置key中的多个field/value。
  • hget key field: 返回指定的key中的field的值。
  • hmget key fields: 获取key中多个field的值。
  • hgetall key: 获取key中的所有field-value。
  • hdel key field [field ...]: 可以删除一个或多个字段,返回值是被删除的字段的个数。
  • del key: 删除整个list。
  • hincrby key field increment: 设置key中field的值增加increment。
  • hexists key field: 判断指定的key中的field是否存在。
  • hlen key: 获取key所包含的field的数量。
  • hkeys key: 获取所有的key
  • hvals key: 获取所有的value

存储list

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。

  • lpush key values [value1, value2 ...]: 指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
  • rpush key values [value1、value2 ...]: 在该list的尾部添加元素
  • lrange key start end: 获取链表中从start到end的元素的值。
  • lpop key: 返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
  • rpop key: 从尾部弹出元素。
  • llen key: 获取列表中元素的个数
  • lpushx key value: 仅当参数中指定的key存在时,向关联的list的头部插入value。如果不存在将不进行插入。
  • rpushx key value: 在该list的尾部添加元素
  • lrem key count value: 删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,删除链表中所有等于value的元素。
  • lset key index value: 设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常。
  • linsert key before|after pivot value: 在pivot元素前或者后插入value这个元素。
  • rpoplpush resource destionation: 将链表中的尾部元素弹出并添加到头部。

存储set

Set集合中不允许出现重复的元素。

  • sadd key values[value1 value2 ...]: 向set中添加数据,如果该key的值已有则不会重复添加。
  • srem key members[member1 member2 ...]: 删除set中指定的成员。
  • smembers key: 获取set中的所有的成员。
  • sismember key member: 判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者改key本身就不存在。
  • sdiff key1 key2..: 返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。
  • sinter key1 key2 key3...: 返回交集
  • sunion key1 key2 key3...: 返回并集
  • scard key: 获取set中成员的数量
  • srandmember key: 随机返回set中的一个成员
  • sdiffstore destination key1 key2 ...: 将key1 key2 相差的成员存储在destination上。
  • sinterstore destination key1 key2 ...: 将key1 key2相交的成员存储在destination上。
  • sunionstore destination key [key...]: 将返回的并集存储在destination上。

存储sortedset

sorted-set与set的主要差别在于Sorted-Set中的每一个成员都会有一个分数(score)与之相关联,用于排序。

  • zadd key score member score2 member2 ...: 将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数替换原始的分数,返回值为新加入到集合中的元素的个数,不包含之前已经存在的元素。
  • zscore key member: 返回指定成员的分数
  • zcard key: 获取集合中的成员数量
  • zrem key member[member...]: 移除集合中指定的成员,可以指定多个成员
  • zrange key start end [withscores]: 获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数。
  • zrevrange key start stop [withscores]: 照元素分数从大到小的顺序返回索引从start到stop之间的所有元素。
  • zremrangebyrank key start stop: 按照排名范围删除元素。
  • zremrangebyscore key min max: 按照分数范围删除元素。
  • zrangebyscore key min max [withscores] [limit offset count]: 返回分数在[min, max]的成员并按照分数从低到高排序。[limit offset count]:offset,表明从脚标为offset的元素开始并返回count个成员。
  • zincrby key increment member: 设置指定成员的增加的分数。
  • zcount key min max: 获取分数在[min, max]之间的成员数量。
  • zrank key member: 返回成员在集合中的排名(从小到大)。
  • zrevrank key member: 返回成员在集合中的排名(从大到小)。

Redis特性

  • 多数据库

一个Redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库。

一个Redis实例最多可以提供16个数据库,下标从0到15,客户端默认连接第0号数据库,也可以通过select选择连接到哪个数据库。

move newkey 1: 将当前库的key移植到1号库中;

ping,测试连接是否存活;

echo,在命令行答应一些内容;

select,选择数据库;

quit,退出连接;

dbsize,返回当前数据库中key的数目;

info,获取服务器的信息和统计;

flushdb,删除当前选择数据库中的所有的key;

flushall,删除所有数据库中的所有key;

消息订阅与发布

subscribe channel: 订阅频道

psubscribe channel*: 批量订阅频道

publish channel content: 在指定的频道中发布消息

redis事务

redis事务的特征:

在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其他客户端的请求提供任何服务,从而保证了事务中的所有命令被原子的执行; 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍会被继续执行;

可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为“BEGIN TRANSACTION”语句,在该语句执行的命令都将被视为事务之内的操作,最后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC之后,那么该事务中所有命令都会被服务器执行。 当使用Append-Only模式时,Redis会通常调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。如果在写入的过程中出现系统崩溃,如电源故障导致宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分的数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似的问题,就会立即退出并给出响应的错误提示。此时,我们只要充分利用Redis工具包中提供的redis-check-aof工具,就可以定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis。

Redis持久化

Redis的高性能是由于其将所有的数据都存储在内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就叫做持久化。

Redis支持两种方式的持久化:

  • RDB的方式

该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘中。

  • AOF的方式

该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后的数据库中的数据是完整的。

  • 无持久化

我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached。

  • Redis可以同时使用RDB和AOF

redis 获取所有key_Redis笔记相关推荐

  1. golang redis获取所有key_Redis 内存分析神器

    RDR 简介 RDR 是解析 redis rdbfile 工具.与redis-rdb-tools相比,RDR 是由golang 实现的,速度更快(5GB rdbfile 在我的PC上大约需要2分钟). ...

  2. Redis——Redis入门和一些笔记

    Redis入门和一些笔记 Redis概述 Redis安装 Redis性能测试 Redis一些基础知识 Redis配置文件 Redis概述 Redis是什么? Redis(Re mote Di ctio ...

  3. 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了

    写在开头 如何系统,全面,的学习redis呢? 我的一个程序员朋友,在之前有面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis 的,他都差点都忘记了自己应聘的是 Java 工程 ...

  4. 出招吧!腾讯专家手敲《Redis源码日志笔记》,不服来对打!

    引言 本文分为六个部分,包括 Redis 源码日志,服务框架,基础数据结构,内功心法,应用,其他,从源码层面循序渐进的了解Redis.可以快速.有效地了解Redis 的内部构造以及运作机制,更好.更高 ...

  5. shell模拟php多进程从redis获取数据(多个redis实例)

    背景:现在的数据已经写到了redis队列里面,完成了入栈的操作,后期打算从redis获取数据,完成出栈的操作,出栈后然后做一系列的逻辑处理 环境: VMware虚拟机  内存:1G   硬盘:60G  ...

  6. shell模拟php多进程从redis获取数据(多个库)

    背景:现在的数据已经写到了redis队列里面,完成了入栈的操作,后期打算从redis获取数据,完成出栈的操作,出栈后然后做一系列的逻辑处理 环境: VMware虚拟机  内存:1G   硬盘:60G  ...

  7. shell模拟php多进程从redis获取数据(一个库多个key值)

    背景:现在的数据已经写到了redis队列里面,完成了入栈的操作,后期打算从redis获取数据,完成出栈的操作,出栈后然后做一系列的逻辑处理 环境: VMware虚拟机  内存:1G   硬盘:60G  ...

  8. shell模拟php多进程从redis获取数据

    背景:现在的数据已经写到了redis队列里面,完成了入栈的操作,后期打算从redis获取数据,完成出栈的操作,出栈后然后做一系列的逻辑处理 环境: VMware虚拟机  内存:1G   硬盘:60G  ...

  9. 极客时间 Redis核心技术与实战 笔记(基础篇)

    Redis 概览 Redis 知识全景图 Redis 问题画像图 基础篇 基本架构 数据结构 数据类型和底层数据结构映射关系 全局哈希表 链式哈希解决哈希冲突 渐进式 rehash 不同数据结构查找操 ...

最新文章

  1. Linux文件内容查看相关命令
  2. hdu 1227(二维dp)
  3. html5 自动横屏,html5自动横屏的方法
  4. SQL语句大全(2)
  5. Day2:360培训学习重点笔记(7.14)
  6. C#实现.rar的动态压缩与解压缩
  7. 世界第一台电脑_研发世界第一台电脑的核心人物,被美国隐瞒35年,只因他是个华人...
  8. 集成建行龙支付(2019.01.24更新)
  9. 曾经,我以为我很懂MySQL索引
  10. 形象理解数字证书的基本安全功能
  11. 北理计算机优营会被鸽吗,被放鸽子以后~
  12. Android app性能优化解决卡慢顿之布局优化
  13. 转---电脑的MAC实际地址可以修改吗?
  14. Maya Python脚本导出OBJ
  15. python一维表二维表转化
  16. DES和RSA混合加密解密
  17. java简单的记事本程序_如何用JAVA编写简单的记事本程序?
  18. 拨号宽带服务器无响应是什么意思,宽带拨号服务器无响应
  19. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第31讲:PHP面向对象程序设计(成员方法)
  20. 服务器运维登记表,日常运维记录表-20210627032441.pdf-原创力文档

热门文章

  1. boost::hana::front用法的测试程序
  2. boost::gil::scoped_channel_value用法的测试程序
  3. boost::gil模块计算直方图的测试程序
  4. BOOST_TEST_LE和BOOST_TEST_LT的用法
  5. VTK:Points之DensifyPoints
  6. VTK:图片之Gradient
  7. OpenCV信息流Alpha遮罩
  8. OpenGL屏幕空间环境光遮挡的实例
  9. OpenGL实现齿轮gears联动
  10. C语言实现队列ADT(Queue ADT)接口COMP2521(附完整源码)