Hadoop之redis命令

网友投稿 236 2022-11-23

Hadoop之redis命令

1.redis简介 Redis是一种面向“键/值”对数据类型的内存数据库,可以满足我们对海量数据的读写需求。 redis的键只能是字符串 redis的值支持多种数据类型:     1:字符串 string    2:哈希 hash     3:字符串列表 list     4 :字符串集合 set 不重复,无序     5:有序集合sorted set ,不重复,有序     6:HyperLogLog 结构(redis2.8.9版本之后才有,用来做基数统计的算法。 特点: 高性能(Redis读的速度是11W次/s,写的速度是8.1W次/s) 原子性(保证数据的准确性) 持久存储(两种方式RDB/快照,AOF/日志) 主从结构(master-slave,负载均衡,高可用) 集群(3.0版本)2014年 应用:应用在高并发和实时请求的场景。 新浪微博 hash:关注列表,粉丝列表 string:微博数,粉丝数(避免使用select count(*) from...) sorted set:TopN,热门微博 2.redis基础命令 获得符合规则的键名称 keys 表达式(?,* ,[],\?) 判断一个键是否存在 exists key 删除键 del key del key1 key2 批量删除 redis-cli del `redis-cli keys "key*"` 获得键值的数据类型type 返回值可能是这五种类型(string,hash,list,set,zset) 注意:redis不区分命令大小写 3. redis的help命令 "help @" to get a list of commands in   "help " for help on   "help " to get a list of possible help topics   "quit" to exit 4.redis数据类型之string 字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB 命令 set/get(setnx) mset/mget incr/decr/incrby/decrby/incrbyfloat append strlen 5.redis数据类型之hash   hash类型的值存储了字段和字段值的映射,字段值只能是字符串,不支持其他数据类型。hash类型的键至多可以存储 个字段。 hash类型适合存储对象: redis可以为任何键增减字段而不影响其他键 命令 hset/hget/hmset/hmget/hgetall(hsetnx) hexists,判断键中的属性是否存在 hincrby(hash类型没有hincr命令) hdel hkeys/hvals hlen(获取键中包含多少个字段) 6.redis数据类型之set set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多        个元素set集合类型和list列表类型的相似之处,如图:2-1所示命令sadd/smembers/srem/sismembersdiff/sinter(交集)/sunion(并集)sdiffstore/sinterstore/sunionstorescard(获取集合长度)/spop(随机从集合中取出并删除一个元素)srandmember key [count]如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。 7.redis数据类型之sorted set 有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。有序集合类型和列表类型的差异:见备注命令zadd/zscore/zrange/zrevrange/zrangebyscore(默认是闭区间,可使用"("使用开区间)zincrby/zcard/zcount(获取指定分数范围的元素个数)zrem/zremrangebyrank/zremrangebyscore扩展:+inf(正无穷)    -inf(负无穷) 8.redis数据类型之HyperLogLog Redis HyperLogLog 是用来做基数统计的算法。优点:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。因为在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。缺点:因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。命令pfadd key element [element ...]pfcount key [key ...]pfmerge destkey sourcekey [sourcekey ...]   9.易错点 set命令(如果 key 已经持有其他类型值, SET 就覆盖旧值,无视类型。) 10.java操作redis 使用jedis第三方jar包操作redismvn依赖                                redis.clients        jedis        2.7.0 数据库连接方式单机单连接方式单机连接池方式多机分布式+连接池方式 package cn.crxy.redis.test01; import static org.junit.Assert.*; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisUtils { private static JedisPool jedisPool = null; /** * 获取一个链接 * @return */ public static synchronized Jedis getJedis(){ if(jedisPool==null){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(10); poolConfig.setMaxWaitMillis(1000); poolConfig.setTestOnBorrow(true); jedisPool = new JedisPool(poolConfig , "192.168.1.170", 6379); } Jedis jedis = jedisPool.getResource(); return jedis; } /** * 返回一个链接 * @param jedis */ public static void returnJedis(Jedis jedis){ jedisPool.returnResourceObject(jedis); } }     RedisTest package cn.crxy.redis.test01; import static org.junit.Assert.*; import java.util.List; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Pipeline; import redis.clients.jedis.Transaction; public class RedisTest { String host = "192.168.1.170"; int port = 6379; Jedis jedis = new Jedis(host, port); @Test public void test1() throws Exception { String value = jedis.get("crxy"); jedis.set("crxy", "crxy.cn"); } @Test public void test2() throws Exception { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(10); poolConfig.setMaxWaitMillis(1000); poolConfig.setTestOnBorrow(true); JedisPool jedisPool = new JedisPool(poolConfig, host, port); Jedis jedis = jedisPool.getResource(); String value = jedis.get("crxy"); System.out.println(value); jedisPool.returnResourceObject(jedis); } /** * 限制网站访客的访问频率 * @throws Exception */ @Test public void test3() throws Exception { String ip = "127.0.0.1"; for(int i=0;i<20;i++){ boolean falg = testLogin(ip); System.out.println(i+"--"+falg); } } private boolean testLogin(String ip) { String value = jedis.get(ip); if(value==null){ jedis.set(ip, 1+""); jedis.expire(ip, 60); }else { int parseInt = Integer.parseInt(value); if(parseInt>10){ System.out.println("访问受限!!!"); return false; } jedis.incr(ip); } return true; } @Test public void test4() throws Exception { String value = jedis.get("crxy"); int parseInt = Integer.parseInt(value); System.out.println("休息一会"); Thread.sleep(3000); parseInt++; jedis.set("crxy", parseInt+""); } @Test public void test5() throws Exception { jedis.watch("crxy"); String value = jedis.get("crxy"); int parseInt = Integer.parseInt(value); parseInt++; System.out.println("休息一会!!"); Thread.sleep(3000); Transaction multi = jedis.multi(); multi.set("crxy", parseInt+""); List exec = multi.exec(); if(exec==null){ System.out.println("值被修改了"); test5(); }else{ System.out.println("正常执行了。、"); } } @Test public void test6() throws Exception { long starttime = System.currentTimeMillis(); for(int i=0;i<10000;i++){ jedis.set("a"+i, i+""); } System.out.println(System.currentTimeMillis()-starttime); } @Test public void test7() throws Exception { long starttime = System.currentTimeMillis(); Pipeline pipelined = jedis.pipelined(); for(int i=0;i<10000;i++){ pipelined.set("b"+i, i+""); } pipelined.sync(); System.out.println(System.currentTimeMillis()-starttime); } }   11.redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。expire    设置生存时间(单位/秒)pexpire设置生存时间(单位/毫秒)ttl/pttl    查看键的剩余生存时间persist    取消生存时间expireat [key] unix时间戳1351858600pexpireat [key] unix时间戳(毫秒)1351858700000应用场景:限时的优惠活动网站数据缓存(对于一些需要定时更新的数据)限制网站访客访问频率(例如:1分钟最多访问10次)   12.redis的事务(transaction)   redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单元。一组事务中的命令要么都执行,要么都不执行。(例如:转账)原理:先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。应用场景一组命令必须同时都执行,或者都不执行。我们想要保证一组命令在执行的过程之中不被其它命令插入。命令multi    事务开始.....exec    事务结束,开始执行事务中的命令discard    放弃事务错误处理1:语法错误:致命的错误,事务中的所有命令都不会执行2:运行错误:不会影响事务中其他命令的执行Redis 不支持回滚(roll back)正因为redis不支持回滚功能,才使得redis在事务上可以保持简洁和快速。java代码手工实现incr递增命令watch命令作用:监控一个或者多个键,当被监控的键值被修改后阻止之后的一个事务的执行。但是不能保证其它客户端不修改这一键值,所以我们需要在事务执行失败后重新执行事务中的命令。注意:执行完事务的exec命令之后,watch就会取消对所有键值的监控unwatch:取消监控 13.redis中数据的排序(sort) sort命令可以对列表类型,集合类型和有序集合类型,以及hash类型键进行排序。sort key [desc] [limit offset count]by 参考键(参考键可以是字符串类型或者是hash类型的某个字段,hash类型的格式为:键名->字段名)如果参考键中不带*号则不排序如果某个元素的参考键不存在,则默认参考键的值为0扩展 get参数get参数的规则和by参数的规则一样get # (返回元素本身的值)扩展 store参数使用store 参数可以把sort的排序结果保存到指定的列表中性能优化1:尽可能减少待排序键中元素的数量2:使用limit参数只获取需要的数据3:如果要排序的数据数量很大,尽可能使用store参数将结果缓存。 14.“发布/订阅”模式 发布:publish例:publish channel message订阅:subscribe例:subscribe channel [.....]取消订阅:unsubscribe例:unsubscribe [channel]按照规则订阅:psubscribe 例:psubscribe channel?按照规则取消订阅:punsubscribe注意:使用punsubscribe命令只能退订通过psubscribe 订阅的频道。 15.redis任务队列 任务队列:使用lpush和rpop(brpop)可以实现普通的任务队列。优先级队列:brpop key1 key2 key3 timeout second 16.redis管道(pipeline) redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。测试发现:1:不使用管道方式,插入1000条数据耗时328毫秒for (int i = 0; i < 1000; i++) {jedis.set("test"+i, "test"+i);} 2:使用管道方式,插入1000条数据耗时37毫秒Pipeline pipelined = jedis.pipelined();for (int i = 0; i < 1000; i++) {pipelined.set("test"+i, "test"+i);}pipelined.sync(); 17.redis持久化(persistence) redis支持两种方式的持久化,可以单独使用或者结合起来使用。第一种:RDB方式(redis默认的持久化方式)第二种:AOF方式 18.redis持久化之RDB rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件中。(文件名在配置文件中dbfilename)redis进行快照的时机(在配置文件redis.conf中)save 900 1:表示900秒内至少一个键被更改则进行快照。save 300 10save 60 10000redis自动实现快照的过程,见备注手动执行save或者bgsave命令让redis执行快照。两个命令的区别在于,save是由主进程进行快照操作,会阻塞其它请求。bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。文件修复:redis-check-dumprdb的优缺点优点:由于存储的有数据快照文件,恢复数据很方便。缺点:会丢失最后一次快照以后更改的所有数据。     redis实现快照的过程 1:redis使用fork函数复制一份当前进程的副本(子进程) 2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件 3:当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。 注意:redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。 这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份 RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。   19.redis持久化之AOF aof方式的持久化是通过日志文件的方式。默认情况下redis没有开启aof,可以通过参数appendonly参数开启。appendonly yesaof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改appendfilename appendonly.aofredis写命令同步的时机appendfsync always 每次都会执行appendfsync everysec 默认 每秒执行一次同步操作(推荐,默认)appendfsync no不主动进行同步,由操作系统来做,30秒一次aof日志文件重写auto-aof-rewrite-percentage 100(当目前aof文件大小超过上一次重写时的aof文件大小的百分之多少时会再次进行重写,如果之前没有重写,则以启动时的aof文件大小为依据)auto-aof-rewrite-min-size 64mb手动执行bgrewriteaof进行重写重写的过程只和内存中的数据有关,和之前的aof文件无关。所谓的“重写”其实是一个有歧义的词语, 实际上, AOF 重写并不需要对原有的 AOF 文件进行任何写入和读取, 它针对的是数据库中键的当前值。文件修复:redis-check-aof动态切换redis持久方式,从 RDB 切换到 AOF(支持Redis 2.2及以上)CONFIG SET appendonly yesCONFIG SET save ""(可选)注意:当redis启动时,如果rdb持久化和aof持久化都打开了,那么程序会优先使用aof方式来恢复数据集,因为aof方式所保存的数据通常是最完整的。注意:如果想把正在运行的redis数据库,从    RDB切换到AOF,建议先使用动态切换方式,再修改配置文件,重启数据库。(不能自己修改配置文件,重启数据库,否则数据库中数据就为空了。) 20.redis中的config命令 使用config set可以动态设置参数信息,服务器重启之后就失效了。config set appendonly yesconfig set save "90 1 30 10 60 100"使用config get可以查看所有可以使用config set命令设置的参数config get *使用config rewrite命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写(Redis 2.8 及以上版本才可以使用),主要是把使用config set动态指定的命令保存到配置文件中。config rewrite注意:config rewrite命令对 redis.conf 文件的重写是原子性的, 并且是一致的: 如果重写出错或重写期间服务器崩溃, 那么重写失败, 原有 redis.conf 文件不会被修改。 如果重写成功, 那么 redis.conf 文件为重写后的新文件。 21.redis的安全策略 设置数据库密码修改配置requirepass password验证密码auth password注意:在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。bind参数(可以让数据库只能在指定IP下访问)bind 127.0.0.1 命令重命名修改命令的名称rename-command flushall cleanall禁用命令 rename-command flushall ""

岁月里,寒暑交替。人世间,北来南往。铭心的,云烟的。都付往事,不念,不问。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何隔离LVDS?哪些应用可以使用LVDS隔离?
下一篇:2020年将会有一半的智能手机实现Type-C互联
相关文章

 发表评论

暂时没有评论,来抢沙发吧~