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

NOSQL 专栏收录该内容
8 篇文章 0 订阅

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



参考
         Redis 命令参考

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

jerome_s

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值