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
岁月里,寒暑交替。人世间,北来南往。铭心的,云烟的。都付往事,不念,不问。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~