redis 获取所有key_Redis笔记

35f88c48fd36bf9d9342b17724d4cd13.png

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

82634d5acb4b9627d203dc2f219fca49.png

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包

41188f42a5001fffef05d7fb60a18828.png
  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

a0ec50927d280a27c15d20c9a2f38440.png
service iptables restart

637ba02af7334b5c5da383585196e2eb.png
  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值