Redis1

Redis是一个很棒的产品,单线程,高读写是它的核心

redis数据库初识

  1. Redis 简介
  2. Redis 的安装配置
  3. Redis 的常见操作
  4. Redis 的数据类型
  5. Redis 的事务控制
  6. Java 操作 Redis 数据库

Redis简介

redis的作用

Redis:REmote DIctionary Server( 远程字典服务器 ) 是完全开源免费的,用 C 语言编写的,遵守 BSD协议,是一个高性能的 (key/value) 分布式内存数据库,基于内存运行并支持持久化的 NoSQL 数据库,是当前最热门的 NoSql 数据库之一 , 也被人们称为数据结构服务器

BSD协议简单的说就是开源自由最大化,不以商业为中心

redis的优缺点

优点

  1. 性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
  2. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  3. 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

缺点

  1. 是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

Redis 的安装(Linux下)

1.下载wget -P /root/softdev http://download.redis.io/releases/redis-5.0.5.tar.gz

2.解压tar zxvf redis-5.0.5.tar.gz -C /root/redis

3.安装C语言环境yum install gcc-c++

4.切换到redis安装目录下.执行make命令

IMAGE

5.配置目录下的redis.conf文件.主要的目的

  1. IMAGE允许其他地址访问

  2. IMAGE关闭保护模式

  3. IMAGE设置密码

6.切换到目录下进行启动src/redis-server redis.conf 可检查是否存在ps -ef |grep redis

IMAGE

可视化工具下载

Redis 的常见操作

  1. Keys *:指令 查看当前这个库中所有的key值
  2. exists key 名字 : 判断某个 key 值是否存在 0 表示不存在 1 表示存在
  3. move key 名字 数据库的索引下标: 将某个值移除到指定的库中
  4. Redis 默认有 16 个库,我们可以通过修改 redis 配置文件 redis.conf 来改变库的数量
  5. select 下标可以切换不同的数据库: select 下标
1
2
3
4
5
6
7
(了解)
flushdb : 删除当前库中所有的 key
flushall : 删除所有库的信息
Info:查看数据库的信息
expire key 名字 秒:设定指定的 key 的存活时间
ttl key 名字 : 查看当前的 key 还有多少存活时间 -1 表示永不过期,-2 表示已经过期
type key 名字 : 查看当前 key 的类型(key String,Object)

Redis的数据类型

String类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SET key 名字 value 值: 设置单一键值对 (key 值相同会覆盖原来的值 , 类似于map 集合 )
GET key 名字:获取指定 key 的值
DEL key 名字:删除指定名称 key
APPEND key 名字 新值:在原有的值的基础上添加新的值
STRLEN key 名字 : 获取字符串的长度
(value 值必须是数字 )
INCR(value 值自动加 1) : incr key名字;
DECR(value 值自动减 1) :decr key名字;
INCRBY 递增值: incrby key名字 数字;
DECRBY 递减值:decrby key名字 数字 ;
GETRANGE : GETRANGE key start end: 获取 value 值的一部分
SETRANGE :SETRANGE key 起始位置 值: 从起始位置开始替换值
SETEX: SETEX key 名字 存活时间 值: 设定一组值同时设定存活时间;
SETNX: SETNX key 名字 值: 设置永久存活的一组值。 (key 值冲突无法存入值 -- 返回值为 0)
MSET: mset key 值 key 值 .... 一次设定多组值,如果 key 值存在也会覆盖
MGET: mget key key 一次获取多个 key 的值
MSETNX: 一次设定多组 key 值,如果有 key 值存在无法添加完成

List类型

1
2
3
4
5
6
7
8
LPUSH: 向集合中添加内容 lpush 集合的名字 值 显示的顺序和添加的顺序相反。
RPUSH: 向集合中添加内容 rpush 集合的名字 值 添加顺序就是显示顺序
LRANGE: 集合的名字 起始位置 结束位置 (-1 代表到集合的末尾 )
LLEN: llen 集合的名字 查看集合的长度
LPOP: lpop 集合的名称 移除集合中的第一个元素
RPOP: rop 集合的名称移除集合中的最后一个元素
LINDEX : 获取制定索引的值 lindex 集合的名称 索引数值
LREM : 删除指定数量的值: lrem 集合的名称 个数 值 ( 集合中有重复值 );

hash类型(hash表的基本操作与string一样.特别适合存储对象数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
HSET: 存放一组键值对 hset key 值的名称 具体的值;(重复添加会覆盖原来的值)
HGET:获取一个值: hget key 值的名称
HMSET: 设定多组键值对 HMSET customer id 1 name zs address beijing
HMGET: 获取过个键对应的值 hmget customer id name address
HGETALL: 获取所有的数据 hgetall key 值;
HDEL: 删除某个指定的 key 的一组 value hdel customer id
HLEN: 当前的 key 有几组对应的键值对
HEXISTS: 判断当前 key 中是否有指定名称的键值对: hexists customer id;
HKEYS:获取所有的 key
HVALS: 获取所有的值
HINCRBY: 增加指定步长的数据 hincrby customer age 2;
HINCRBYFLOAT: 在原有的基础上增加指定的小数。 hincrbyfloat customer course 0.5
HSETNX: 如果 value 中的 key 重复不能添加到集合中。

set类型(无序不重复)

1
2
3
4
5
6
7
8
9
SADD:添加值 sadd 集合名称 值 ....
SMEMBERS:查看值 smembers 集合名称
SCARD : 集合中元素个数 scard 集合名称
SREM : 删除集合中的某个值 srem 集合名称 值;
SPOP: 随机从集合中移除一个数据 spop 集合名称
SMOVE: 将集合中的某个值赋给另外一个集合: SMOVE 集合 1 集合 2 值;
SDIFF: 差集
SINTER: 交集
SUNION: 并集

Zset类型(是 string 类型的有序集合,也不可重复)

1
2
3
4
5
6
7
8
9
10
11
sorted set 中的每个元素都需要指定一个分数,根据分数对元素进行升序排序,如果多个元素有相同的分数,则以字典序进行升序排序
Zadd:创建集合并设定标准 zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5(等级划分的数据)
ZRANGE: 查询所有的标准 ZRANGE zset01 0 -1 , ZRANGE zset01 0 -1 withscores
ZRANGEBYSCORE : 根据分数查询内容
ZRANGEBYSCORE zset01 60 90 ( 注意如果前面添加”(” 表示不包含节点的意思 )
withscores limit 起始位置 数量 .
ZREM : 删除元素 zrem 集合 某 score 下对应的 value 值。ZREM zset01 v5
ZCARD: 统计有几个键值对 zcard 集合
ZCOUNT: zcount 集合 数值 1 数值 2 统计区间的值
ZRANK : 统计对应的下标 zrank 集合名 values
ZSCORE : zscore 集合名 values 获取对应的分数
1
2
3
4
5
6
7
8
9
10
11
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES

5.redis的事务规则

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
1
2
3
4
5
6
7
8
9
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec

maven项目下使用java操作redis数据库

1.创建一个简单的maven项目pom.xml如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>

2.使用jredis模板

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
package com.wwj.test;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class TestRedis {

@Test
public void testJedis() {
// 创建一个 Jedis 的连接
Jedis jedis = new Jedis("144.202.3.120", 6379);
// 密码认证 如果设置了密码,就需要进行认证
jedis.auth("redis");
// 执行 redis 命令
jedis.set("mytest", "hello world, this is jedis client!");
}

@Test
public void testJedisPool() {
// 创建一连接池对象
JedisPool jedisPool = new JedisPool("144.202.3.120", 6379);
// 从连接池中获得连接
Jedis jedis = jedisPool.getResource();
// 密码认证 如果设置了密码,就需要进行认证
jedis.auth("redis");
String result = jedis.get("mytest");
System.out.println(result);
// 关闭连接
jedis.close();
// 关闭连接池
jedisPool.close();
}

}

redis练习操作
分布式锁参考文章