2022-05-26  2022-05-26    3863 字   8 分钟

Redis介绍

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。

Redis的按装

1. 下载redis

2. 上传到linux上并进行解压缩

tar zxf redis-5.0.5.tar.gz

3. 按装redis运行环境

Redis是c语言开发的安装redis需要c语言的编译环境。如果没有gcc需要在线安装

yum install gcc-c++

yum -y install gcc automake autoconf libtool make 

yum -y install  tcl

4. 编译。进入redis源码目录

make

5. 安装。

make install PREFIX=/usr/local/redis

PREFIX参数指定redis的安装目录。一般软件安装到/usr/local/redis目录下

6. Redis服务端启动

 ./redis-server

7. 使用redis-cli连接到redis

 ./redis-cli

[root@ibm001 bin]# ./redis-cli

127.0.0.1:6379>

8. 退出客户端

 Quit

 Exit

9. 关闭redis服务

./redis-cli shutdown

Reids的相关配置

  1. 后台启动redis.不要阻塞前端窗口

把redis-5.0.5中的redis.conf 复制到 redis/bin目录中

cp redis.conf /usr/local/redis/bin

编辑redis.conf

Vi redis.conf     把daemonize 改为yes

  1. 后台启动redis

./redis-server redis.conf

查看后台进程

ps aux |grep redis

  1. 远程连接redis

./redis-cli -h 192.168.18.201 -p 6379

Could not connect to Redis at 192.168.18.201:6379: Connection refused不能够远程连接redis

修改redis.conf

把bind给注释掉

然后关闭redis服务 ./redis-cli shutdown

重新启动redis服务 ./redis-server redis.conf

远程连接  ./redis-cli -h 192.168.18.201 -p 6379

  1. 可以给redis设置密码

修改redis配置文件

把该行去掉注释,同时可以指定密码

然后关闭redis服务 ./redis-cli shutdown

重新启动redis服务 ./redis-server redis.conf

远程连接  ./redis-cli -h 192.168.18.201 -p 6379

关闭redis服务

./redis-cli -a 123456 shutdown

利用rdm来远程连接redis

只有15个库,select加下标选择库  如select 1,select 15100004

Redis的数据类型

String类型

Map<String,String>

1.语法 set key  value 设置key的值

示例:set name zhangsan

set age 22

set name lisi  如果key存在,将会覆盖原来key的值

2.语法 get key 获取key的值

示例:get name

get age

3.语法 del key 删除指定key的值

示例:del name

del age

4.语法: append key value 在原来的值的基础上添加新值

示例:set name zhangsan

append name lisi

5.语法: strlen  key 获取指定key的值的长度

strlen  name      12

6.语法: getrange key  start  end 获取指定key的值,从start位置开始,end位置结束

示列:getrange name 2 7

7.语法: setrange key offset value 从起始位置替换值

示例:setrange name 2 abc

8.语法: setex key second  value 设置key的值并指定存活时间

示例: setex name 100 lisi

9.语法:setnx key value 设置key的值并且永久有效

示例:setnx address beijing

10.语法: incr key 对key的值自增1

示列: incr currentPage

11.语法: decr key 对key的值自减1

示列: decr currentPage

12.语法: incrby key  number 对key的值递增number

示列: incrby currentPage 10

13.语法: decrby key  number 对key的值递减number

示列: decrby currentPage 5

14.语法: mset key1 value1 key2 value2 …. 一次性设置多个key-value键值对

示列: mset name1 zhangsan name2 lisi name3 wangwu

15.语法: mget key1 key2 …. 一次性获取多个key的值

示列: mget name1 name2

16.语法 expire key seconds 设置key的存活时间 seconds秒数

示例  expire address 30

17 语法 ttl key 查看key的存活时间  如果返回-1 表示永久有效

示例  ttl name

18.语法 persist key 设该key永久有效

示列  persist address

Hash数据类型

Map<String,Map<String,String»

1.语法: hset key  field  value 设置key 的 field字段的值

示列: hset person name lisi

hset person address changsha

hset person birthday 1997-10-10

2.语法: hget key field 获取key的field字段的值

示例: hget person name

4.语法: hmset key field1 value1  field2 value2 …. 一次设置key的多个字段的值

示例: hmset student name wagnwu age 22 gender man

5.语法: hmget key  field1 field2 …. 一次获取key的多个字段的值

示例: hmget student name age gender

6.语法: hgetall key 获取key的多个字段的值(包括键和值)

示例: hgetall student

7.语法: hkeys key 获取key的所有字段

示例: hkeys student

8.语法: hvals key 获取key的所有字段的值

示例: hvals student

9.语法: hdel key field1 field2 … 删除key的所有多个字段的值

示例: hvals student

10.语法: hlen key 返回key的所有键值对的个数

示例: hlen student

11.语法: hexists key field 返回key的field字段是否存在

示例: hexists student name

List数据类型

1.语法: lpush key value1 value2…. 向key集合的左边一次添加值

示例: lpush ages 22 34 21 45 20

2.语法: rpush key value1 value2…. 向key集合的右边一次添加值

示例: rpush names zhangsan lisi wangwu zhaooiu

3.语法: lrange key start stop 取key集合中指定的start位置到stop位置的内容(-1代表集合结束)

示列:lrange ages 0 2

lrange ages 0 -1

lrange ages 0 100

4.语法: llen   key 查看key集合的长度

示例: llen ages

5.语法: lpop   key 删除key集合的第一个元素

示例: lpop  ages

6.语法: rpop   key 删除key集合的最后一个元素

示例: rpop   ages

7.语法: lindex  key  index 获取key集合的index索引的元素

示例: lindex   ages  2

8.语法: lrem key count value 删除key集合的count个索引的元素(集合中有重复值)

示例: lrem ages 2  45

set数据类型

1.语法: sadd  key  value1 value2 … 向为key的集合中添加多个值(去重)

示例: sadd empNames zhangsan lisi wangwu zhaoliu lisi

2.语法: smembers   key 循环key集合中的所有值

示例: smembers empNames

3.语法: scard   key 统计key集合中的元素个数

示例: scard empNames

4.语法: srem    key   value 删除key集合中的value值

示例: scard empNames  lisi

5.语法: spop    key 随机删除key集合中的某个值

示例: spop  empNames

6.语法: smove source destination member 将集合中的某个值赋给另外一个集合: SMOVE 源集合  目的集合  值

示例: smove empNames works zhangsan

7.语法: Sdiff 集合1 集合2 求差集

示例: sadd seta a b c d e

sadd setb c d e f g

sdiff seta setb

  1. “a”

  2. “b”

sdiff setb seta

  1. “f”

  2. “g”

8.语法: sinter 集合1 集合2 求交集

示例: sinter seta setb

  1. “d”

  2. “c”

  3. “e”

9.语法: sunion 集合1 集合2 求并集

示例: sunion seta setb

  1. “d”

  2. “a”

  3. “b”

  4. “c”

  5. “e”

  6. “f”

  7. “g”

zset(SortedSet)数据类型

1.语法: zadd  key   score value … 向为key的集合中添加多个(score-value)

示例: zadd students 1 zhangsan 3 lisi 2 wangwu 5 zhaoliu

2.语法: zrange key start stop [WITHSCORES] 循环key的集合从start位到stop位置的值

示例: zrange students 0 -1

  1. “zhangsan”

  2. “wangwu”

  3. “lisi”

  4. “zhaoliu”

3.语法: zrem key value 删除key集合中指定的value元素

示例: zrem students lisi

4.语法: zrevrange key start stop   [WITHSCORES] 逆序显示key集合中的元素

示例: zrevrange students 0 -1

zrevrange students 0 -1 withscores

5.语法: zrangebyscore key min max 根据分数区间查询内容

示例:zrangebyscore students 2 5

6.语法: zcard key 统计key集合中有多少个键值对

示例: zcard students

7.语法: zcount key min max 统计key集合中min到max区间元素

示例: zcount students 1  4

8.语法: zrank students wangwu 统计key集合中指定元素索引

示例: zrank students wangwu

9.语法: zscore key value 统计key集合中指定元素的分数

示例: zscore students zhangsan

关于redis的持久化方案

Redis中所有的key和value默认加载到内存中,为了数据的不丢失,把数据进行持久化,通常会把数据落地磁盘。

第一种持久化方案(默认rdb)

In the example below the behaviour will be to save:

#   after 900 sec (15 min) if at least 1 key changed

#   after 300 sec (5 min) if at least 10 keys changed

#   after 60 sec if at least 10000 keys changed

对于数据不敏感,可以用这种方式,可以会丢数据,但效率高。(减少I/o操作)。

第二种持久化方案 aof

修改redis.conf

对数据特别敏感,保证不能丢数据。效率低(增加I/o操作)

利用Jedis API来操作redis

  1. 导入依赖
 

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-context</artifactId>

 <version>4.3.20.RELEASE</version>

 </dependency>

 <dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-aspects</artifactId>

 <version>4.3.20.RELEASE</version>

 </dependency>

 <dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-webmvc</artifactId>

 <version>4.3.20.RELEASE</version>

 </dependency>

 <dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-jdbc</artifactId>

 <version>4.3.20.RELEASE</version>

 </dependency>

 <dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jms</artifactId>

<version>4.3.20.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>4.3.20.RELEASE</version>

</dependency>

<dependency>

 <groupId>redis.clients</groupId>

 <artifactId>jedis</artifactId>

 <version>2.9.0</version>

</dependency>

 <!-- 返回json字符串的支持 -->

 <dependency>

 <groupId>com.fasterxml.jackson.core</groupId>

 <artifactId>jackson-databind</artifactId>

 <version>2.8.8</version>

 </dependency>

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-test</artifactId>

 <version>4.3.0.RELEASE</version>

 </dependency>

<dependency>

 <groupId>junit</groupId>

 <artifactId>junit</artifactId>

 <version>4.12</version>

 <scope>test</scope>

</dependency>
  1. 把相关的类交给spring容器管理
 

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

 <!-- 最大空闲连接数 -->

 <property name="maxIdle" value="3" />

 <!-- 最大连接数 -->

 <property name="maxTotal" value="5" />

 <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->

 <property name="blockWhenExhausted" value="true" />

 <!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 -->

 <property name="maxWaitMillis" value="30000" />

 <!-- 在获取连接的时候检查有效性 -->

 <property name="testOnBorrow" value="true" />

 </bean>

 <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">

 <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>

 <constructor-arg name="host" value="192.168.18.201" />

 <constructor-arg name="port" value="6379" />

 <constructor-arg name="timeout" value="30000" />

 <constructor-arg name="password" value="123456"></constructor-arg>

 </bean>

测试

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class JedisTest {

 @Autowired

 private JedisPool jedisPool;

 @Test

 public void testAdd(){

 Jedis jedis = jedisPool.getResource();

 jedis.set("name","wangwu");

 jedis.close();

 }

 @Test

 public void testAddPerson(){

 Person person=new Person(100,"张三","男",22,new Date());

 Jedis jedis = jedisPool.getResource();

 // jedis.set("person", JsonUtils.objectToJson(person));

 jedis.hset("persons",person.getName(),JsonUtils.objectToJson(person));

 jedis.close();

 }

 @Test

 public void testAddPerson2(){

 Jedis jedis = jedisPool.getResource();

 String jsonData=jedis.get("person");

 Person person=JsonUtils.jsonToEntity(jsonData,Person.class);

 System.out.println(person);

 jedis.close();

 }

}

avatar
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :