Redis--基本命令及Java操作
本篇博文主要讲解,Redis的基本使用、基本命令、数据类型以及通过java操作Redis数据库(Jredis)。内容命令过多,不会一一演示,建议读者联想记忆。如果还没有搭建好环境请参考上篇博文:http://blog.xiaoxiaomo.com/2016/02/23/Linux-软件安装之Redis/。
redis基础命令
获得符合规则的键名称
keys 表达式(?,* ,[],\?)
判断一个键是否存在
exists key删除键
del key
del key1 key2获得键值的数据类型type
返回值可能是这五种类型(string,hash,list,set,zset)。
注意:redis的命令不区分大小写
- 实例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13127.0.0.1:6379> exists blog
(integer) 1
127.0.0.1:6379> exists blogs
(integer) 0
127.0.0.1:6379> set blogs momo
OK
127.0.0.1:6379> keys *
1) "blogs"
2) "blog"
127.0.0.1:6379> del blogs
(integer) 1
127.0.0.1:6379> keys *
1) "blog"
redis的help命令
- help command
1
2
3
4
5
6
7
8
9
10
11
12127.0.0.1:6379> help
redis-cli 3.0.6
Type: "help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
127.0.0.1:6379> help del
DEL key [key ...]
summary: Delete a key
since: 1.0.0
group: generic
数据类型
string
字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。在实际生产环境中我们存放json字符串比较常用,一个字符串类型的值存储的最大容量是1GB。
- 命令
1
2
3
4
5set/get(setnx)
mset/mget ##返回/设置(一个或多个)给定 key 的值。
incr/decr/incrby/decrby/incrbyfloat
append ##append key value,将 value 追加到 key 原来的值的末尾,如果 key 不存在,key 设为 value
strlen ##字符串长度
hash
hash类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他数据类型。hash类型的键至多可以存储 (2的32次方-1)个字段。hash类型适合存储对象,redis可以为任何键增减字段而不影响其他键。
命令
1
2
3
4
5
6hset/hget/hmset/hmget/hgetall(hsetnx)
hexists ##判断键中的属性是否存在
hincrby ##为哈希表 key 中的域 field 的值加上增量
hdel ##删除
hkeys/hvals ##返回哈希表 key 中的所有键/值
hlen ##返回哈希表 key 中域的数量实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23redis> HGET counter page_view
"200"
redis> HINCRBY counter page_view -50
(integer) 150
redis> HGET counter page_view
"150"
# 尝试对字符串值的域执行HINCRBY命令
redis> HSET myhash string hello,world # 设定一个字符串值
(integer) 1
redis> HGET myhash string
"hello,world"
redis> HINCRBY myhash string 1 # 命令执行失败,错误。
(error) ERR hash value is not an integer
redis> HGET myhash string # 原值不变
"hello,world"
list
list是一个有序的字符串列表,列表内部实现是使用双向链表(linked list)实现的。list还可以作为队列使用,一个列表类型的键最多能容纳(2的32次方-1)个元素。
- 命令
1
2
3
4
5
6lpush/rpush/lpop/rpop
llen/lrange(-1表示最后一个元素的位置)
lindex(查询指定角标数据)
lset(修改)
ltrim(截取,保留指定数据)
rpoplpush:将元素从一个列表转到另一个列表
set
set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多(2的32次方-1)个元素 set集合类型和list列表类型的相似之处。
命令
1
2
3
4
5sadd/smembers/srem/sismember
sdiff/sinter(交集)/sunion(并集)
sdiffstore/sinterstore/sunionstore
scard(获取集合长度)/spop(随机从集合中取出并删除一个元素)
srandmember key [count]注 :
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
sorted set
有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。
命令
1
2
3
4
5zadd/zscore/zrange/zrevrange/
zrangebyscore ##默认是闭区间,可使用"("使用开区间
zincrby/zcard/zcount ##获取指定分数范围的元素个数
zrem
##扩展:+inf(正无穷) -inf(负无穷)更多命令请查看:http://doc.redisfans.com/
java操作redis
使用jedis第三方jar包操作redis , mvn依赖
1
2
3
4
5<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>实例代码一 : 通过Jedis操作
1
2
3
4
5
6
public void TestRedis(){
Jedis jedis = new Jedis( "192.168.3.56" , 6379 ) ;
jedis.set("user:info:xxo","23");
System.out.println(jedis.get("user:info:xxo"));
}实例代码二 : redis连接池
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void TestRedisPool(){
//1. 连接池配置
JedisPoolConfig config = new JedisPoolConfig() ;
config.setMaxIdle(50); //最大空闲连接
config.setMaxTotal(100); //最大连接数
config.setMaxWaitMillis(2000); //最长连接时间
config.setTestOnBorrow(true); //校验
//2. 通过连接池获取Jedis
JedisPool pool = new JedisPool(config, "192.168.3.56", 6379);
Jedis jedis = pool.getResource(); //获取Jedis
//3. 通过Jedis操作数据
jedis.set("user:info:xxo:age", String.valueOf(23)) ;
System.out.println(jedis.get("user:info:xxo:age"));
}实例代码三 : 模拟一个限制非法访问连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void userVisit(){
for (int i = 0; i < 15; i++) {
System.out.println(checkIP("192.168.3.59"));
}
}
private boolean checkIP(String ip) {
//1. 创建一个对象
Jedis jedis = new Jedis("192.168.3.56", 6379) ;
//2. 查看ip,如果不存在
String key = jedis.get(ip);
if( key == null ){
jedis.set( ip , "1" );
jedis.expire( ip , 5 ) ; //有效时间
}
//3.是否在5s之类超过限制,这里限制为10次
else{
int count = Integer.valueOf( key ) ;
if( count >= 10 ){
return false;
}
else{
//jedis.set( ip , (++count)+"" ) ;
jedis.incr(ip) ;//自动增加1,等于incrBy(ip,1);
}
}
return true ;
}expire设置一个键的生存时间,到时间后redis会自动删除它。指定时间点expireAt(expireAt [key] unix时间戳)
应用场景:
限时的优惠活动信息
网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
手机验证码(短信验证码)
限制网站访客访问频率(例如:1分钟最多访问10次)
附录相关redis命令
连接操作相关的命令
quit:关闭连接(connection)
auth:简单密码认证持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串对List操作的命令
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素对Hash操作的命令
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value参考资料
http://my.oschina.net/davehe/blog/129082?fromerr=6dre9pGK