Redis
一,第三方客户端介绍
如果是Linux下,在使用之前需要放行6379端口
编辑iptables文件
vi /etc/sysconfig/iptables
放行6379
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
保存后,重启防火墙
service iptables reload 或者 service iptables restart
二,在java中使用redis(重要)
1.Jedis介绍
redis不仅可以通过命令行来操作,现在主流的语言(Java,C#…)基本都有客户端的支持.所以我们要通过java来操作Redis.
企业里用的最多的是Jedis.
Jedis:只是java操作Redis的客户端,相当于jdbc
2.Jedis使用步骤
如果连接的是Lixus上的,要放行6379端口,否则连接不上; windows版本(在本机上)的Redis不需要
导入jar包
创建jedis对象
new Jedis("192.168.17.136", 6379)
操作redis数据库 set,get,del
释放资源 close
- Example:
@Test public void fun01(){ String host = "localhost"; int port = 6379; //创建jedis对象 Jedis jedis = new Jedis(host, port); //set key value jedis.set("akey", "aaa"); String value = jedis.get("akey"); System.out.println("value="+value); jedis.del("akey"); System.out.println(jedis.get("akey")); //释放资源 jedis.close(); } @Test public void fun02(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); String host = "localhost"; int port = 6379; JedisPool jedisPool = new JedisPool(poolConfig, host,port); Jedis jedis = JedisUtils.getJedis(); //set key value jedis.set("akey", "aaa"); String value = jedis.get("akey"); System.out.println("value="+value); jedis.del("akey"); System.out.println(jedis.get("akey")); //释放资源 jedis.close(); }
3.Jedis工具类的抽取(使用连接池)
public class JedisUtils {
//配置
static JedisPoolConfig config;
//连接池
static JedisPool pool;
static{
config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(10);
config.setMaxIdle(5);
pool = new JedisPool(config, "192.168.147.128", 6379);
}
//获得jedis
public static Jedis getJedis(){
Jedis jedis = pool.getResource();
return jedis;
}
}
三,redis中数据结构
redis中存储的数据是以key-value的形式存在的.其中value支持5种数据类型
字符串(String)
哈希(hash)
字符串列表(list)
字符串集合(set)
有序的字符串集合(sorted-set或者叫zset)
key不要太长(不能>1024个字节),
也不要太短 .
key在项目里面最好统一写法, key的常用的写法:
项目名子模块key名称; crm_order_username
四,存储字符串(掌握)
1.概述
string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的 。一个键最大能存储512MB。
2.常见命令
命令 | 描述 |
---|---|
set key value | 设置指定 key 的值 |
get key | 获取指定 key 的值 |
incr key | 将 key 中储存的数字值增一 |
decr key | 将 key 中储存的数字值减一 |
getset key value | 先获取,再设置 |
incrby key count | 将key 中储存的数字值增加指定数量 |
decrby key count | 将key 中储存的数字值减少指定数量 |
append key value | 如果 key 已经存在并且是一个字符串,将 value 追加到 key 原来的值的末尾;若无,则设置一个 |
del key | 删除key |
+ 设置
set key value
获取
get key
删除
del key
自增
incr key
自减
decr key
扩展命令
getset key value:先获取再设置
incrby key count:指定增加数量
decrby key count:指定减少数量
append key value:追加(若有指定的key 则追加,若无,则设置一个),相当于拼接字符串
五,存储hash(掌握)
1.概述
Redis中hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。**
Redis存储hash可以看成是String key 和String value的map容器. 也就是说把值看成map集合.
Eg:
KEY Value user1 username tom age 18 user2 username jack sex man
2.常见命令
命令 | 命令描述 |
---|---|
hset key field value | 将哈希表 key 中的字段 field 的值设为 value |
hmset key field1 value1[field2 value2] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
hget key filed | 获取存储在哈希表中指定字段的值 |
hmget key filed1 filed2 | 获取多个给定字段的值 |
hgetall key | 获取在哈希表中指定 key 的所有字段和值 |
hdel key filed1 [filed2] | 删除一个或多个哈希表字段 |
del key | 删除整个hash |
hlen key | 获取哈希表中字段的数量 |
hincrby key filed increment | 为哈希表 key 中的指定字段的浮点数值(整数)加上增量 increment 。 |
hkeys key | 获取所有哈希表中的字段 |
hvals key | 获得所有的value |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在。 |
+ 设置
hset key field value :设置一个键值对
hmset key field1 value1 field2 value2 ... :设置多个键值对
获取
hget key filed:获取存储在哈希表中指定字段的值 hmget key filed1 filed2...:获取多个给定字段的值 hgetall key:获取在哈希表中指定 key 的所有字段和值(了解)
删除
hdel key filed1 filed2 ...: 删除指定的字段 hdel key:删除整个hash
扩展命令
- hlen key 获取哈希表中字段的数量
- hincrby key filed increment:给指定的子键增加指定的值
- hkeys key:获取所有哈希表中的字段
- hvals key:获得所有的value
- HEXISTS key field:查看哈希表 key 中,指定的字段是否存在。
六,存储list
1.概述
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 特点:有序
- ArrayList
单向链表
双向链表
2.常见命令
命令 | 命令描述 |
---|---|
lpush key value1 value2… | 将一个或多个值插入到列表头部(左边) |
rpush key value1 value2… | 在列表中添加一个或多个值(右边) |
lpop key | 左边弹出一个 |
rpop key | 右边弹出一个 |
lrange key startindex endindex | 获取列表指定范围内的元素eg:(0 -1:查看所有, 0 3查看前4个) |
llen key | 返回指定key所对应的list中元素个数 |
lrem key count member | 在key中移除指定个数的成员count > 0:从左往右移除指定个数,count < 0:从右往左移除指定个数, count = 0:清空list中指定元素 |
lset key index value | 通过索引设置列表元素的值(0代表第一个元素, 1代表第二个,-1代表尾元素), |
linsert key before|after pivot value | 在pivot元素前或者元素后插入一个值 |
rpoplpush resource destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
rpoplpush的使用场景:
两端的插入(没有的话,会创建一个)
lpush key value1 value2... rpush key value1 value2...
两端的移除
lpop key :左边弹出一个 rpop key :右边弹出一个
查看
lrange key startindex endindex; eg: lrange key 0 -1 查看所有的 lrange key 0 3; 查看前4个(从左边开始...)
获取列表的个数
llen key: 返回指定key所对应的list中元素个数
了解的命令
lrem key count member:在key中移除指定个数的成员 如果count > 0:从左往右移除指定个数 count < 0:从右往左移除指定个数 count = 0:清空list中指定元素 lset key index value: 通过索引设置列表元素的值. 0代表第一个元素, -1代表尾元素 linsert key before|after pivot value: 在pivot元素前或者元素后插入一个值 rpoplpush resource destination: 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
七,存储set
1.概述
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
特点:无序,唯一
2.常见命令
命令 | 命令描述 |
---|---|
sadd key member1 [member2] | 向集合添加一个或多个成员 |
srem key member1 [member2] | 移除一个成员或者多个成员 |
smembers key | 返回集合中的所有成员,查看所有 |
sismember key member | 判断一个set中是否有指定的member |
sdiff key1 key2 | 返回给定集合的差集 (第一个减第2个) |
sunion key1 key2 | 返回给定集合的并集 |
sinter key1 key2 | 返回给定集合的交集 |
scard key | 获得set中成员的数量 |
srandmember key | 随机返回set的一个成员 |
sdiffstore key1 key2 key3 | 将差异的部分插入key1 (不是添加而是重新创建) |
使用场景:
添加
sadd key member1 member2
移除
srem key member1 member2
查看所有
smembers key
判断一个set中是否有指定的member
sismember key member
聚合运算
- sdiff key1 key2: 差集. 我有你没有
- sinter key1 key2: 交集. 我有加你有
- sunion key1 key2: 并集. 我有你也有
扩展命令
- scard key: 获得set中成员的数量
- srandmember key: 随机返回set的一个成员
- sdiffstore key1 key2 key3:将差异的部分插入key1
八,存储sortedset
1.概述
Redis 有序集合(sortedset)和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个!!(double)!!类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
2.常见命令
命令 | 命令描述 |
---|---|
zadd key score1 member1[ score2 member2] | 添加一个或者多个 score1(分数) member(名字) |
zcard key | 获得集合成员数量 |
zscore key member | 获取元素的得分 |
zrem key member1[member2] | 删除一个或者多个成员 |
zrange key startindex endindex [withscores] | 按照分数的从小到大的顺序展示所有的元素 |
zrevrange key start stop [withscores] | 按照分数的从大到小的顺序展示所有的元素 |
+ 添加
zadd key score1 member1 score2 member2...
获得集合成员数量
zcard key
获取元素的得分
zscore key member
删除
zrem key member1 member2...
展示所有的元素
zrange key startindex endindex [withscores]; 按照分数的从小到大的顺序展示所有的元素 zrevrange key start stop [withscores]; 按照分数的从大到小的顺序展示所有的元素
九,通用的操作
keys *: 查询所有的key
exists key:判断是否有指定的key 若有返回1,否则返回0
expire key 秒数:设置这个key在缓存中的存活时间
ttl key:展示指定key的剩余时间
若返回值为 -1:永不过期
若返回值为 -2:已过期或者不存在
del key:删除指定key
rename key 新key:重命名
type key:判断一个key的类型
十,redis的特性
1.多数据库性
redis默认是16个数据库, 编号是从0~15.
- select index:切换库
- move key index: 把key移动到几号库(index是库的编号)
- flushdb:清空当前数据库
- flushall:清空当前实例下所有的数据库
2.服务器命令(自学)
- ping :测试连接是否存活
- echo str: 打印内容
- quit: 退出连接
- dbsize:返回当前数据库key的数目
- info:获取服务器信息
3.订阅发布
- subscribe channel: 订阅频道
- psubscribe *: 批量订阅频道 eg: psubscribe a b c
- publish channel content:在指定的频道发布内容