Redis简述与Jedis开发

Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

Redis 事务:

1 MULTI 标记一个事务块的开始。

2 DISCARD 取消事务,放弃执行事务块内的所有命令。
3 EXEC 执行所有事务块内的命令。

java 集成

java 开发客户端下载(这里只介绍jedis -- 原因是:开源,测试用例写得很全,用的人多查资料方便):

1.导入依赖包:
commons-lang-2.5.jar
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
包含上面3个jar 包的测试工程下载地址: http://download.csdn.net/download/tan3739/9994290
测试代码:

public static void main(String[] args) {
	    Jedis jedis = new Jedis("192.168.10.66", 16325);// Redis 数据库服务器的IP和端口
	    jedis.auth("12.1ekEJk234asdf1{}[]eu^&&$&#*($#kej:");// Redis 数据库服务器的密码
        System.out.println("服务正在运行: "+jedis.ping());
        jedis.set("site-list:100:title", "Try123456");
        String re = jedis.get("site-list:100:title");
        System.out.println("re:"+re);
        System.out.println("连接成功");
        jedis.close();
}

关于源码:

密码

出于安全设置,Radis 默认只允许本机访问,要允许其它客户端也能访问,需要注释掉这一行: bind 127.0.0.1
$ vi redis.conf
#bind 192.168.1.100 10.0.0.1
#bind 127.0.0.1 ::1


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#bind 127.0.0.1

其次再设置操作密码,注意客户端不用密码就能连接Redis,是操作的时候再检查密码,而Redis是可高并发访问的(150k/s),所以你的密码必须设置得足够复杂,以防被黑客破解。我下面设置的密码为:rek}j3jdiejdh&%^^*9039876A_+{U

$ vi redis.conf
requirepass rek}j3jdiejdh&%^^*9039876A_+{U

保存后重启Redis

设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。
输入密码的命令为:

AUTH password
$ auth rek}j3jdiejdh&%^^*9039876A_+{U

java jedis连接设置密码:

jedis.auth("rek}j3jdiejdh&%^^*9039876A_+{U");

持久化

语法: save 禁止持久化,注释以下几行:
#save ""
#save 900 1
#save 300 10
#save 60 10000

这个查了一些资料,说 配置文件里面配置的save 持久化 调用的是bgsave,但本人并未去测试验证
只要禁止持久化,Redis 就是一台 memcached 服务器所以你只要学了Redis 就没有什么必要再去学 memcached。

简述小结:

Redis 虽然都是靠 key-value 键值对来存储对象,但其内部还是有分类型的, 主要是靠命令来区分类型,如get,set都是String(当然也可以是任意可持久化的对象哦);lpush、lpop 则是链表,sadd 是集合,zadd、zincrby、zrevrange 是有序集合

Jedis开发

使用java开发redis,博主使用的是jedis,需要引入jedis的jar,可以在这里下载。还需要commons-pool.jar包
这里写图片描述

连接

    Jedis jedis = new Jedis("10.10.195.112");
    System.out.println(jedis.ping());
  
  
  • 1
  • 2

输出:PONG

操作字符串

        jedis.set("name", "zzh");
        System.out.println(jedis.get("name"));
  
  
  • 1
  • 2

输出:zzh

操作列表

        jedis.lpush("nblist", "jj");
        jedis.lpush("nblist", "jj");
        jedis.lpush("nblist", "yy");
        jedis.lpush("nblist", "qq");
        List<String> list = jedis.lrange("nblist", 0, -1);
        int length = list.size();
        for(int i=0;i<length;i++)
        {
            System.out.println(list.get(i));
        }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出:

qq
yy
jj
jj
  
  
  • 1
  • 2
  • 3
  • 4

获取redis中所有的键

    Set<String> set = jedis.keys("*");
    for(String key : set)
    {
        System.out.println(key);
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

输出:

nam
name
tutorial
list
tutorial-list
nblist
tutoriallist
keyname
user
listt
zsetkey
hash-key
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Redis常用命令

1 连接操作命令

  • quit:关闭连接(connection)
  • auth:简单密码认证
  • help cmd: 查看cmd帮助,例如:help quit

2 持久化

  • save:将数据同步保存到磁盘
  • bgsave:将数据异步保存到磁盘
  • lastsave:返回上次成功将数据保存到磁盘的Unix时戳
  • shutdown:将数据同步保存到磁盘,然后关闭服务

3 远程服务控制

  • info:提供服务器的信息和统计
  • monitor:实时转储收到的请求
  • slaveof:改变复制策略设置
  • config:在运行时配置Redis服务器

4 对key操作的命令

  • 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

5 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的子串

6 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的头部

7 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的一个元素

8 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

9 Zset

  • zadd("zset", 3,"key1")):zset中添加元素,分数为3
  • zadd("zset",map)):zset中添加元素map
  • 其中:
    Map<String,Double> map = new HashMap<>();
    map.put("key2",1.2);
    map.put("key3",1.2);
    map.put("key4",5.0);
    map.put("key5",0.2);
    
  • jedis.zrange("zset", 0, -1):zset中的所有元素
  • jedis.zrangeWithScores("zset", 0, -1):zset中的所有元素
  • jedis.zrangeByScore("zset", 0,100):zset中的所有元素
  • jedis.zrangeByScoreWithScores("zset", 0,100):zset中的所有元素
  • jedis.zscore("zset", "key2"):zset中key2的分值
  • jedis.zrank("zset", "key2"):zset中key2的排名
  • jedis.zrem("zset", "key3"):删除zset中的元素key3
  • jedis.zcard("zset"):zset中元素的个数
  • jedis.zcount("zset", 1, 4):zset中分值在1-4之间的元素的个数
  • jedis.zincrby("zset", 5, "key2"):key2的分值加上5
  • 猜你喜欢

    转载自blog.csdn.net/qq_32534441/article/details/85857312