Redis 简介、Linux 安装 Redis、Redis 使用

来源:互联网 发布:c语言库函数手册 编辑:程序博客网 时间:2024/05/18 01:25

Redis 简介


        Redis 是一种内存型数据存储,也可以将它写入磁盘中来实现耐久性。Redis 可通过两种方式来持久存储数据:RDB 和 AOF。RDB 持久性按照指定的间隔对您的数据集执行时间点快照。它不是非常耐久,而且您可能会丢失一些数据,但它非常快。AOF 的持久性要长得多,而且记录了服务器收到的每个写入操作。在查询 Redis 时,将从内存中获取数据,绝不会从磁盘获取数据,Redis 对内存中存储的键和值执行所有操作。

        Redis 采用了一种客户端/服务器模型,借用该模型来监听 TCP 端口并接受命令。Redis 中的所有命令都是原子性的,所以您可以从不同的客户端处理同一个键,没有任何争用条件。如果您使用的是 memcached(一个内存型对象缓存系统),您会发现自己对它很熟悉,但 Redis(可以说)是 memcached++。Redis 也支持数据复制。

数据模型


        Redis 数据模型不仅与关系数据库管理系统 (RDBMS) 不同,也不同于任何简单的 NoSQL 键-值数据存储。Redis 数据类型类似于编程语言的基础数据类型,所以开发人员感觉很自然。每个数据类型都支持适用于其类型的操作。受支持的数据类型包括: 
        - 字符串
        - 列表
        - 集合
        - 有序集
        - 哈希值

关键优势


        Redis 的优势包括它的速度、它对富数据类型的支持、它的操作的原子性,以及它的通用性:
        - Redis 非常快。它每秒可执行约 100,000 个 SET 以及约 100,000 个 GET 操作。您可以使用 redis-benchmark 程序在自己的机器上对它的性能进行基准测试。(redis-benchmark 模拟在它发送总共 M 个查询的同时,N 个客户端完成的 SET/GET 操作。)
        - Redis 对大多数开发人员已知道的大多数数据类型提供了原生支持,这使得各种问题得以轻松解决。经验会告诉您哪个问题最好由何种数据类型来处理。
        - 因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值。
        - Redis 是一个多效用工具,对许多用例很有用,这些用例包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据(比如 Web 会话、Web 页面命中计数)等。

Redis 安装


        linux centos6.5安装

        1. 使用离线包tar安装
        (tar链接:http://pan.baidu.com/s/1qWvFXQO 密码:k5r6 )
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
tar xzf redis-3.0.3.tar.gz
cd redis-3.0.3
make
#启动服务的
cd /src
./redis-server
#使用客户端 可以输入pinginfo查看信息
./redis-cli
        2. yum在线安装
yum install epel-release
yum install redis
#启动停止
service redis start/stop
#客户端
redis-cli

Redis 数据类型操作示例


        下面分别介绍Redis 支持的数据类型的简单示例。

字符串(string)

redis> SET firstname shekhar
OK
redis> GET firstname
"shekhar"
        如果您的键的值是整数,那么可使用 DECR 或 DECRBY 递减这些值,使用 INCR 或 INCRBY 递增它们。这些操作在您希望维护一些对象的数量(比如网页的命中次数)的情形中很有用
redis> INCR votes
(integer) 1
redis> INCR votes
(integer) 2
redis> INCR votes
(integer) 3
redis> DECR votes
(integer) 2

其他一些操作(包括 APPENDGETRANGEMSET 和 STRLENGTH 也可用于字符串。请参见http://doc.redisfans.com/string/index.html )


列表(list)


        有序的字符串列表,按照插入顺序排序。Redis 中的列表是一个有序的字符串集合,您可以向其中添加任意数量的(惟一或非惟一)元素。除了向列表添加元素和从中获取元素的操作之外,Redis 还支持对列表使用取出、推送、范围和其他一些操作。


使用 LPUSH 命令,最近添加的单词位于列表顶部,以前添加的单词会在后面:

redis> LPUSH words austerity
(integer) 1
redis> LPUSH words socialism moratorium socialism socialism
(integer) 5
使用 LRANGE 命令查看列表中顶部的三个单词:

redis> LRANGE words 0 2
1) "socialism"
2) "socialism"
3) "moratorium"
获得列表的长度,可使用 LLEN 命令:
redis > LLEN words
(integer) 5
删除:
#删除所有 socialism
redis> LREM words 0 socialism
(integer) 2
删除列表:
redis 127.0.0.1:6379> DEL words
(integer) 1

集合(set)


        集合(set)是惟一元素的无序集合。不可重复。

将一个元素添加到一个集合中,可使用 SADD 命令;要获取一个集合的所有成员,可使用 SMEMBERS 命令。
redis> SADD uniquewords austerity
(integer) 1
redis> SADD uniquewords socialism
(integer) 1
redis> SADD uniquewords socialism
(integer) 0
redis> SMEMBERS uniquewords
1) "austerity"
2) "socialism"

找出两个集合中的所有共同元素,SINTER 命令。合并多个集合,我使用SUNION 命令。

有序集(zset)


        有序集合字符串列表,不可重复。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
        
        假设您希望基于单词的长度对一组单词进行排序。使用 ZADD 命令将一个元素添加到一个有序集中,使用语法 ZADD 键分数 值。使用ZRANGE 命令按分数查看一个有序集的元素。
redis> ZADD wordswithlength 9 austerity
(integer) 1
redis> ZADD wordswithlength 7 furtive
(integer) 1
redis> ZADD wordswithlength 5 bigot
(integer) 1
redis> ZRANGE wordswithlength 0 -1
1) "bigot"
2) "furtive"
3) "austerity"
要获得有序集的大小,可使用 ZCARD 命令:
redis 127.0.0.1:6379> ZCARD wordswithlength
(integer) 3

哈希值(hash)

        hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

        哈希值允许您针对一个哈希值存储一个键-值对。此选项可能对您希望保存具有多个属性的对象的情形很有用,就像以下示例一样:
redis> HSET user:1 name shekhar
(integer) 1
redis> HSET user:1 lastname gulati
(integer) 1
redis> HGET user:1
redis> HGET user:1 name
"shekhar"
redis> HGETALL user:1
1) "name"
2) "shekhar"
3) "lastname"
4) "gulati"


Redis IDE 工具使用(RedisDesktopManager)


        1. 下载  

            链接:http://pan.baidu.com/s/1bnwg0OZ 密码:ekwu


使用java客户端 jedis操作redis


pom

  <dependency>

   <groupId>redis.clients</groupId>

   <artifactId>jedis</artifactId>

   <version>2.1.0</version>

  </dependency>

 

测试代码

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import redis.clients.jedis.Jedis;
 
public class TestRedis {
    private Jedis jedis;
 
    public TestRedis() {
        jedis = new Jedis("123.59.42.xx"6379);
        // 权限认证
        // jedis.auth("admin");
    }
 
    /**
     * redis存储字符串
     */
    public void testString() {
        jedis.set("name""Jerome苏");
        jedis.expire("name"60); // 设置存活时间
        // jedis.del("name"); //删除某个键
 
        System.out.println("name----->>>" + jedis.get("name"));
    }
 
    /**
     * redis操作Map
     */
    public void testMap() {
 
        Map<String, String> map = new HashMap<String, String>();
        map.put("name""jerome");
        map.put("age""24");
        map.put("email""jerome_s@qq.com");
        jedis.hmset("user", map); // 存入redis
 
        // 取出
        List<String> rsmap = jedis.hmget("user""name""age");
        System.out.println(rsmap);
 
        // 删除map中的某个键值
        // jedis.hdel("user", "age");
 
        // System.out.println(jedis.hlen("user")); // 返回key为user的键中存放的值的个数2
        // System.out.println(jedis.exists("user"));// 是否存在key为user的记录 返回true
        // System.out.println(jedis.hkeys("user"));// 返回map对象中的所有key
        // System.out.println(jedis.hvals("user"));// 返回map对象中的所有value
 
    }
 
    /**
     * jedis操作List
     */
    public void testList() {
        // 开始前,先移除所有的内容
        jedis.del("animals");
        // -1表示取得所有
        System.out.println(jedis.lrange("animals"0, -1));
 
        // 存入List
        jedis.lpush("animals""cat");
        jedis.lpush("animals""dog");
        jedis.lpush("animals""tiger");
        System.out.println(jedis.lrange("animals"0, -1));
 
        // 删除单个
        jedis.rpush("animals""cat");
        System.out.println(jedis.lrange("animals"0, -1));
    }
 
    /**
     * jedis操作Set
     */
    public void testSet() {
        // 添加
        jedis.sadd("user""jerome");
        jedis.sadd("user""jelly");
        jedis.sadd("user""jack");
        jedis.sadd("user""nemo");
        jedis.sadd("user""who");
 
        // 移除noname
        jedis.srem("user""who");
 
        System.out.println(jedis.smembers("user"));// 获取所有加入的value
        System.out.println(jedis.sismember("user""who"));// 判断 who是否是user集合的元素
        System.out.println(jedis.srandmember("user"));
        System.out.println(jedis.scard("user"));// 返回集合的元素个数
    }
 
    /**
     * redis排序
     
     * @throws InterruptedException
     */
    public void testSort() throws InterruptedException {
        // 注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
        jedis.del("a");// 先清除数据,再加入数据进行测试
        jedis.rpush("a""1");
        jedis.lpush("a""6");
        jedis.lpush("a""3");
        jedis.lpush("a""9");
        System.out.println(jedis.lrange("a"0, -1));// [9, 3, 6, 1]
        System.out.println(jedis.sort("a")); // [1, 3, 6, 9] //输入排序后结果
        System.out.println(jedis.lrange("a"0, -1));
    }
 
    public static void main(String[] args) {
        TestRedis redis = new TestRedis();
        redis.testMap();
        // RedisUtil.getJedis().set("newname", "中文测试");
        // System.out.println(RedisUtil.getJedis().get("newname"));
    }
}

    使用连接池

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
public final class RedisUtil {
 
    // Redis服务器IP
    private static String ADDR = "192.168.0.100";
 
    // Redis的端口号
    private static int PORT = 6379;
 
    // 访问密码
    // private static String AUTH = "admin";
 
    // 可用连接实例的最大数目,默认值为8;
    // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    private static int MAX_ACTIVE = 1024;
 
    // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    private static int MAX_IDLE = 200;
 
    // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
    private static int MAX_WAIT = 10000;
 
    private static int TIMEOUT = 10000;
 
    // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private static boolean TEST_ON_BORROW = true;
 
    private static JedisPool jedisPool = null;
 
    /**
     * 初始化Redis连接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxActive(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWait(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            // jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 获取Jedis实例
     
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            else {
                return null;
            }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    /**
     * 释放jedis资源
     
     * @param jedis
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
}

code: 链接:http://pan.baidu.com/s/1qW5PJic 密码:pyha



参考
        http://www.ibm.com/developerworks/cn/java/os-springredis/index.html
        Redis 命令参考
        Java中使用Jedis操作Redis
        http://www.runoob.com/redis/redis-tutorial.html
        redis 五种数据类型的使用场景


代码

        https://github.com/JeromeSuz/demo_code_repo/tree/master/src/main/java/redis

0 0
原创粉丝点击