Redis入门

来源:互联网 发布:jsbrowser是什么软件 编辑:程序博客网 时间:2024/06/06 03:34

Redis入门

NoSQL

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

为什么需要NoSQL?

  • High performance - 高并发读写
  • High Storage - 海量数据的高效率存储和访问
  • High Scalability && High Availability - 高可扩展性和高可用性

主流NoSQL产品

  • mongoDB
  • Redis

NoSQL数据库的四大分类

  • 键值(Key-Value)存储 - 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
  • 列存储 - 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
  • 文档数据库 - 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。
  • 图像数据库 - 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便

NoSQL的特点

  • 易扩展
  • 灵活的数据模型
  • 大数据量,高性能
  • 高可用

Redis

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis使用场景

  • 缓存
  • 任务队列
  • 网站访问统计
  • 数据过期处理
  • 应用排行榜
  • 分布式集群架构中的session的分离

Redis的安装

参加官网Redis的安装

redis jar包下载,如果需要使用Redis连接池的话,还需要commons-pool2

Mac安装Redis Desktop Manager

可参考mac安装Redis可视化工具-Redis Desktop Manager

安装好后,先建立连接,参见How to start using RDM

效果如下:

rdm

Jedis入门

Jedis是Redis官方首选的Java客户端开发包

简单的存储,使用示例如下:

        // 设置ip和端口        Jedis jedis = new Jedis("localhost", 6379);        // 保存数据        jedis.set("name", "imooc");        // 获取数据        String value = jedis.get("name");        System.out.println(value);        // 释放资源        jedis.close();

连接池方式连接,基本使用方式如下:

        // 获取连接池的配置对象        JedisPoolConfig config = new JedisPoolConfig();        // 设置最大连接数        config.setMaxTotal(30);        // 设置最大空闲连接数        config.setMaxIdle(10);        // 获得连接池        JedisPool jedisPool = new JedisPool(config, "localhost", 6379);        // 获取核心对象        Jedis jedis = null;        try {            // 通过连接池获得连接对象            jedis = jedisPool.getResource();            // 设置数据            jedis.set("name", "张三");            // 获取数据            String value = jedis.get("name");            System.out.println(value);        } catch (Exception e) {            e.printStackTrace();        } finally {            //释放资源            if(jedis != null){                jedis.close();            }            if (jedisPool != null) {                jedisPool.close();            }        }

Redis的数据结构

Redis的数据结构有以下几种:

  • 字符串(String)
  • 字符串列表(List)
  • 有序字符串集合(Sorted set)
  • 字符串集合(set)
  • 哈希(hash)

Key定义的要点:

  • 不要过长、过短
  • 统一的命名规范

字符串

在Redis中,存储字符串:

  • 二进制安全的,存入和获取数据相同
  • Value最多可以容纳的数据长度是512M

存储字符串常用命令

1.赋值

使用SET命令来存储value

set server:name "fido"

2.取值

使用GET命令来取值

GET server:name

使用getset命令,先获取值,再设置值

getset server:name "imooc"

3.删除

使用DEL删除某个key

DEL server:name

删除后,再获取get server:name,返回为(nil)

4.数值的增减

incr将指定keyvalue递增1,如果这个值不存在,就先把值设为0incr之后就变为1

SET connections 10INCR connections => 11INCR connections => 12DEL connectionsINCR connections => 1

decr将指定keyvalue递减1,如果这个值不存在,就先把值设为0decr之后就变为-1

decr num => -1

incrby将指定keyvalue,增加一个指定的值

incrby num 5 => 4

decrby将指定keyvalue,减去一个指定的值

decrby num 5 => -1

APPEND key value如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾,返回值是字符串的长度

127.0.0.1:6379> append num 4(integer) 3127.0.0.1:6379> get num"-14"

哈希

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

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)

1.Hset命令用于为哈希表中的字段赋值

  • 基本语法为HSET KEY_NAME FIELD VALUE
  • 如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。
127.0.0.1:6379> hset myhash username jack(integer) 1127.0.0.1:6379> hset myhash age 18(integer) 1

2.Hmset命令可以一次设置多个field-value

  • 如果命令执行成功,返回 OK 。
127.0.0.1:6379> hmset myhash2 username rose age 21OK

3.Hget命令用于返回哈希表中指定字段的值

127.0.0.1:6379> hget myhash username"jack"

4.Hmget命令一次得到一个或多个给定字段的值

127.0.0.1:6379> hmget myhash username age1) "jack"2) "18"

5.Hkeys 命令用于获取哈希表中的所有域(field)

127.0.0.1:6379> hkeys myhash1) "username"2) "age"

列表

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

存储List的方式:

  • ArrayList使用数组方式来存储数据,这种方式根据索引去查询数据比较快,但新增和删除元素的时候,涉及到位移操作,所以比较慢
  • LinkedList使用双向链接方式,新增和删除元素的时候,比较快
  • 双向链表中添加、删除数据

1.两端添加
Lpush 命令将一个或多个值插入到列表头部,返回值为列表的长度

127.0.0.1:6379> lpush mylist a b c(integer) 3127.0.0.1:6379> lpush mylist 1 2 3(integer) 6

Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)

2.查看列表
Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 STARTEND 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

127.0.0.1:6379> lrange mylist 0 51) "3"2) "2"3) "1"4) "c"5) "b"6) "a"

3.两端弹出

Lpop 命令用于移除并返回列表的第一个元素,返回值为列表的第一个元素。 当列表 key 不存在时,返回 nil

127.0.0.1:6379> lpop mylist "3"

Rpop 命令用于移除并返回列表的最后一个元素。

4.获取列表中元素的个数

Llen 命令用于返回列表的长度

127.0.0.1:6379> llen mylist(integer) 5

5.其它

Lset 通过索引来设置元素的值。

127.0.0.1:6379> lset mylist 3 mmmOK127.0.0.1:6379> lrange mylist 0 -11) "2"2) "1"3) "c"4) "mmm"5) "a"

Linsert 命令用于在列表的元素前或者后插入元素,语法为LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE

Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

redis 127.0.0.1:6379> RPUSH mylist "hello"(integer) 1redis 127.0.0.1:6379> RPUSH mylist "foo"(integer) 2redis 127.0.0.1:6379> RPUSH mylist "bar"(integer) 3redis 127.0.0.1:6379> RPOPLPUSH mylist myotherlist"bar"redis 127.0.0.1:6379> LRANGE mylist 0 -11) "hello"2) "foo"

集合

Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

常用命令:
1.Sadd 命令将一个或多个成员元素加入到集合中

127.0.0.1:6379> sadd myset a b c(integer) 3127.0.0.1:6379> sadd myset a(integer) 0

2.Srem 命令用于移除集合中的一个或多个成员元素

127.0.0.1:6379> sadd myset 1 2 3(integer) 3127.0.0.1:6379> srem myset 1 2 (integer) 2

3.Smembers 命令返回集合中的所有的成员
4.Sismember 命令判断成员元素是否是集合的成员

有序集合

Sorted-set与set的区别:
Sorted-set的每一个成员都有一个分数与之关联,redis根据分数对成员进行从小到大的排序

持久化

Redis虽然是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

  • RDB持久化-将redis在内存中的的状态保存到硬盘中,它可以手动执行,也可以再redis.conf中配置,定期执行
  • AOF持久化-将以日志的形式记录服务器所处理的每一个操作,在redis服务器启动之初,它会读取该文件,来重新构建数据库,来保证启动后数据库数据的完整