接上一篇
1 key可以有过期的设置
2 Lists 列表
插入元素很快,
按索引查询,慢
//列表是自动创建和删除的
//从左侧添加给List1 一个值 1
lpush list1 1
//从右侧添加2
rpush list1 2
//返回list1的值,从索引0 到最后
lrange list1 0 -1
//可变参数
lpush list1 1 3 3 2
//从list中右侧那一个查询并删除
rpop list1
//子列表,其他的被删除
//保留list中索引0 ~ 2的,并返回,其他的删除
ltrim list1 0 2
//实现队列. 左侧添加(生产),右侧弹出(消费)
//如果右侧弹出为nil,那么会等待一段时间再弹
lpush list1 666
rpop list1
//实现阻塞队列
//block right pop 从list1中右侧弹出元素,如果为null,那么等待(阻塞)5秒
//直到有元素返回 0为一直阻塞(问,中间多久轮询一次?)
brpop list1 5
3 hash(map)
//创建表hash_user1 ,里面的key-value对,分别为name:wanganyu 等等
hmset hash_user1 name wanganyu age 23 address 回龙观东大街
//从hash中获得key为name的value
hget hash_user1 name
//获得全部value
hgetall hash_user1
//返回hash中key为name ,age的值得数组
hmget hash_user1 name age
4 set(集合)
无序
//添加
sadd set1 1 3 6
//查看元素(返回的是无序的)
smembers set1
//查看是否存在某元素
sismember set1 3
返回1 ,否则返回0
//删除元素并返回(随机)
spop set1
//交集 操作
sinter set1 set2 set3
//并集操作
sadd set1 set2
5 有序集合
添加时慢(因为要排序),取时快(因为有序了)
//添加 下面的2,56是分数, 是排序的依据
zadd zset1 2 “tom”
zadd zset1 56 “john”
//查看元素(从第0个到倒数第一个)
zrange zset1 0 -1
//反序查看
zrevrange zset1 0 -1
//根据分数返回 (小于某值的所有)
zrangebyscore zset1 -inf 4
//根据分数删除(分数在2到8之间)
zremrangebyscore zset1 2 8
//获得元素的位置
zrank zset1 “tom”
6 位图(bitmaps)
基体是一个字符串,每一个是一个‘位’,值为0或者1 。
//设置某位的值(字符串bm1,第10位设置为1)
setbit bm1 10 1
//取某位的值(返回1,或者0)
getbit bm1 10
//计算所有值为1的位的数量
bitcount bm1
//找到第一个为1的位(索引)
bitpos bm1
7 redis可以像zookeeper一样,实现发布订阅的功能
8 事务
格式如下:
//标记一个事务块的开始
multi
命令1
命令2
//执行上述命令
exec
8-2:
其他: discard 取消事务
9 脚本
除了执行一条命令,还可以执行脚本
使用eval
eval “return xxxxx”
10 管理服务器
10-1 查看信息
info
11 管道技术
其实就是 一次性提交多个请求到server,然后一次性返回所有响应,
以此提升性能
12 java客户端 jedis
http://my.oschina.net/lilw/blog/169635
采用桥接(跟主机平行的关系)的网络连接方式,
我本机ip192.168.1.102,虚拟机ip 106
使用如下代码测试连接时,出现一些问题,最终解决,打印了PONG(通)
Jedis jedis = new Jedis(“192.168.1.106”,6379);
System.out.println(jedis.ping());
问题1:连接不上redis.虽然ping的tong106.
解决: 关闭虚拟机的防火墙,重启虚拟机。
方法为,在终端执行chkconfig iptables off
问题2:提示 DENIED Redis is running in protected mode because protected mode is enabled 等错误
解决:vim编辑redis.config文件,把保护模式变为no.重启
如果提示readonly不能保存文件,那么使用sudo vim
测试是否能连上虚拟机配置的redis服务
/***
* 测试是否能连上虚拟机配置的redis服务
* @author wangany
*
*/
public class JedisConnectTest {
/**
* @param args
*/
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.1.106",6379);
System.out.println(jedis.ping());
}
public void testStringKey(){
}
}
创建连接池对象
/***
* 真实环境,获得jedis连接 要使用连接池
*
*
* @author wangany
*
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;//连接池对象
/***
* 从连接池中 获取一个jedis对象
* @return
*/
public static Jedis getJedis(){
if(jedisPool==null){
iniPool();
}
return jedisPool.getResource();
}
/***
* 初始化连接池对象
*/
public static void iniPool(){
if(jedisPool==null){
createPool();
}
}
/***
* 创建连接池对象
*
* 真实环境,配置的信息要抽离出来
*/
public static void createPool(){
// 建立连接池配置参数
JedisPoolConfig config = new JedisPoolConfig();
// 设置最大连接数
config.setMaxIdle(100);
// 设置最大阻塞时间,记住是毫秒数milliseconds
config.setMaxWaitMillis(1000);
// 设置空间连接
config.setMaxIdle(10);
// 创建连接池
jedisPool = new JedisPool(config, "192.168.1.106", 6379);
}
/***
* 回收一个jedis对象到连接池
* @param jedis
*/
public static void gc(Jedis jedis){
jedisPool.returnResource(jedis);
}
常用的操作
/***
* 常用的操作
* key
* list
* set
* hset等
* @author wangany
*
*/
public class JedisCommonOpt {
private static Jedis jedis;
public JedisCommonOpt() {
jedis = getJedis();
}
public static Jedis getJedis(){
if(jedis==null){
jedis = JedisPoolUtil.getJedis();
}
return jedis;
}
/***
* 测试 key
*/
public void testKey() {
jedis.set("key1", "value1");
String value1 = jedis.get("key1");
System.out.println(value1);
}
/***
* 测试 list
*/
public void testList() {
String[] valueOfList1 = {"value1OfList1","value2OfList1","value3OfList1"};
jedis.lpush("list1", valueOfList1);
// 获取存储的数据并输出
List list = jedis.lrange("list1", 0 ,-1);
for(int i=0; i<list.size(); i++) {
System.out.println("Stored string in redis:list1: "+list.get(i));
}
}
public static void main(String[] args) {
JedisCommonOpt opt = new JedisCommonOpt();
//opt.testKey();
opt.testList();
}
}