Redis入门

概念

Redis是一款nosql系列的非关系型数据库。nosql= not only sql,而不是not sql的意思。

关系型数据库的数据之间会存在关联关系,而且数据是存放在硬盘上的。而非关系型数据库之间的数据是没有关系的,而且数据存放在内存中。

显然数据存放在内存中可以带来更快的速度,但是缺点么,内存里的数据断电就没了,所以实际上我们需要把两者结合在一起使用。我们会把数据存在关系型数据库中,而使用nosql作为缓存。

在实际中我们经常碰到一些缓存的需求,比如某个数据我经常用到,每次一用到就去数据库中取的话显然性能不好,那么我就开辟一个内存空间来存放这些数据(比如实际中我们会定义一个map对象来使用),但是由于map是依赖于jvm的,而jvm分配的内存还是没那么大,所以需要像redis这样的nosql数据库出马来解决问题。

下载安装

直接在linux上安装:

1
2
3
4
5
6
7
8
9
10
sudo apt update
sudo apt install redis-server

//安装完成之后会自动启动,启动的时候报错:
Failed to start Advanced key-value store.

// 查阅资料发现是redis默认绑定ipv6的地址,而我的机器没有ipv6地址,所以出错,修改一下即可
dpkg -L redis-server
vim /etc/redis/redis.conf
redis-server /etc/redis/redis.conf

在windows上的话,直接从官网下载下来解压即可使用。

远程连接

本地连接是没有问题的,远程连接会提示你redis目前在保护模式,我的解决方案是设置了一个密码,然后通过redis-cli -h 118.xxx.xxx.xxx连接上,然后输入auth 密码即可。当然还可以通过绑定客户端ip地址让指定的客户端访问、或者暴力点直接关闭保护模式这两种办法来解决。

命令操作

Redis的数据结构:key-value这种形式的数据,其中key都是字符串,而value有下面五种数据结构:

  • 字符串 string
  • 哈希类型 hash:相当于Java中的map
  • 列表list:相当于linkedlist
  • 集合 set
  • 有序集合 sortedset

下面我们对这五种属性进行简单介绍:

string

  1. 存储: set key value
  2. 获取: get key
  3. 删除: del key

hash

下面的key你可以理解为map的名字,而field其实是map的key。

  1. 存储: hset key field value,比如可以存入两条数据,hset hashTest name zhangsan hset hashTest password 123
  2. 获取: hget key field,获取所有: hgetall key
  3. 删除: hdel key field

list

可以添加一个元素到列表的头部(left)或者尾部(right)。

  1. 增加: lpush key value rpush key value
  2. 获取:lrange key start end 范围获取,两个都是闭区间。和python一样,可以用-1代表最后一个。
  3. 删除:lpop key rpop key,会返回删除的值

set

  1. 存储:sadd key value
  2. 获取:smembers key
  3. 删除:srem key value

sortedset

  1. 存储:zadd key score value,是对这个分数来进行排序的。
  2. 获取:zrange key start end
  3. 删除:zrem key value

其它常用命令

  • keys *获得所有的key。
  • type key 获得指定key对应的value的类型
  • del key 直接删除整个key和所对应的value

持久化

刚刚说了redis是在内存中操作的,那必然需要有方法能存储数据到硬盘里,之后再恢复到内存中。

RDB

默认方式,在一定方式的时间内,如果有大量key发生变化,则持久化数据到硬盘上,可以通过修改配置文件来修改。

AOF

通过设置,来记录每一条命令的操作、或者每隔一秒钟来进行一次记录,然后就可以还原出数据。可以每执行一条命令就持久化一下,也可以指定每秒记录一下。当然这个对性能影响较大。

Jedis

简单使用

  1. 导入jar包:jediscommons-pool2

  2. 1
    2
    3
    Jedis jedis = new Jedis("localhost", 6379);
    jedis.set("name", "myname");
    jedis.close();
  3. 完成。

更简单的是,它所有的方法和命令是同名的,而且Java中也有和它对应的数据结构,所以很爽,用起来毫无障碍。

###连接池

1
2
3
4
JedisPool jedisPool = new JedisPool("localhost",6379);
Jedis jedis = jedisPool.getResource();
jedis.set("name", "myname");
jedis.close();

这个更爽,相比起阿里的droid这种连接池来说,直接使用就好。