Redis

Posted 花伶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。

1.目录

1、  redis介绍

a)        什么是NoSql

b)        NoSql的分类

c)        什么是redis

d)        Redis干啥用

2、  redis安装(重点)

3、  redis客户端

a)        redis自带客户端

b)        图形界面的客户端(了解)

c)        Java客户端jedis(重点)

4、  Redis数据类型(重点)

a)        String类型

b)        Map类型

c)        List类型

d)        Set类型

e)        SortedSet

 

2 Redis介绍

2.1 什么是NoSql

为了解决高并发,高可用,高可扩展,大数据存储等一系列的问题而产生的数据库解决方案就是Nosql。

Nosql,也叫做非关系行数据库,它的全名叫Not only sql。它不能代替关系型数据库,只能作为关系型数据

库的一个良好补充。

关系型数据库是指:mysql, oracle,sqlserver

2.2NoSql的分类

a.键值存储数据库

相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

典型应用: 内容缓存,主要用于处理大量数据的高访问负载。

数据模型: 一系列键值对(key-value)

优势: 快速查询

劣势: 存储的数据缺少结构化

b.列表存储数据库

相关产品:Cassandra, HBase, Riak

典型应用:分布式的文件系统

数据模型:以列簇式存储,将同一列数据存在一起

优势:查找速度快,可扩展性强,更容易进行分布式扩展

 劣势:功能相对局限

c.文档性数据库

相关产品:CouchDB,MongoDB

典型应用:web应用(与key-Value类似,Value是结构化的)

数据模型:一系类键值对

优势:数据结构要求不严格

劣势:查询性能不高缺乏统一的查询语法

d. 图形(Graph)数据库

相关数据库:Neo4J、InfoGrid、Infinite Graph

典型应用:社交网络

数据模型:图结构

优势:利用图结构相关算法。

劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

2.3 什么是Redis

Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值

类型来存储数据。

键值类型:

String 字符类型

map散列类型

list列表类型

set集合类型

sortedset有序集合类型

2.4redis历史发展

开始于08年意大利一个叫 Salvatore Sanfilippo牛逼的人。

2.5 redis应用场景

缓存(数据查询,短链接,新闻内容,商品内容)

分布式集群框架中的session分离

任务队列。(秒杀,抢购,12306等等)

应用场景排行榜。

(Sortest)

网站访问统计

数据过期处理

3 redis安装

3.1 redis下载

官网地址:http://redis.io/

3.2 redis安装

redis安装环境会安装到Linux系统中。

安装一个远程插件叫filezillaclient_406,然后把Redis拉到它的目录下

(注意头部的主机,用户名不要忘记填)

进行安装的时候一定要保证你的虚拟机能够联网

#  cd/

#ls

# cd opt

对redis的压缩包进行解压缩

a.  Redis解压缩之后的文件是用c语言写的源码文件

[root@localhost ~]# tar -xvf redis-4.0.11.tar.gz  

  安装c语言环境(安装centos之后,自带c语言环境)

b.  [root@localhost ~]# yum install gcc-c++

   编译redis源码

 

[root@localhost ~]# cd redis-4.0.11

[root@localhost redis-3.0.0]# make

   安装redis

[root@localhost redis-3.0.0]# make install PREFIX=/usr/local/redis

注意:

这一步如果报这个错误You need tcl 8.5 or newer in order to run the Redis test

则安装tcl

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

tar -zxvf tcl8.6.1-src.tar.gz

cd /tcl8.6.1/unix/

sudo ./configure

sudo make

sudo make install

3.3.1前段启动

前端启动的命令:

       [root@localhost bin]# ./redis-server

前端启动的关闭:

       强制关闭:Ctrl+c   

       正常关闭:[root@localhost bin]# ./redis-cli shutdown

杀掉进程:ps –aux|grep redis    查redis服务的进程编号

             然后使用kill -9 进程编码

启动界面:

前端启动的问题:

       一旦客户端关闭,则redis服务也停掉。

3.3.2后端启动

第一步:需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下

[root@localhost bin]# cp  /redis的解压目录下/redis.conf ./

第二步:修改redis.conf文件,将daemonize改为yes

先要使用vim redis.conf

第三步:使用命令后端启动redis

[root@localhost bin]# ./redis-server redis.conf

第四步:查看是否启动成功

ps  -aux|grep redis

看是否有redis进程

root      20157  0:00 ./redis-server 127.0.0.1:6379

关闭后端启动的方式:

强制关闭:[root@localhost bin]# kill -9 20157 

正常关闭:[root@localhost bin]# ./redis-cli shutdown

在项目中,建议使用正常关闭。

因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。

如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

4 Redis客户端

 4.1redis自带的客户端

启动

启动客户端命令:

[root@localhost bin]# ./redis-cli  -h 127.0.0.1 -p 6379

-h:指定访问的redis服务器的IP地址

-p:指定访问的redis服务器的port端口

./redis-cli -h 127.0.0.1 -p 6379 --raw      //可让中文显示

还可以写成:[root@localhost bin]# ./redis-cli

使用默认配置:默认的IP[127.0.0.1],默认的port [6379]

关闭

Ctrl+c

127.0.0.1:6379>quit

测试

[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 6379 --raw

127.0.0.1:6379>set name 张三

ok

127.0.0.1:6379> get name

张三

4.2图形界面客户端

安装:

redis-desktop-manager-0.7.9.809.exe

16 的db

默认存储的第一个db

使用命令开放6379端口

firewall-cmd  --permanent  --add-port=6379/tcp

4.3 jedis客户端

4.3.1 jedis介绍

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js (火)、Go等。

       在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。

Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

Redis:nosql数据库

Jedis:java客户端工具(通过代码操作redis)

4.3.2 工程搭建

添加jar包

Jedis-2.7.0.jar

Commons-pool2-2.3.jar

依赖

<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.7.3</version>
    </dependency>

4.3.3单实例连接 redis

public class JedisDemo01 {
    public static void main(String[] args) {
        //创建jedis对象  参数一:主机的ip  参数二:redis的端口
        Jedis jedis = new Jedis("192.168.82.188",6379)
       //通过redis赋值
        jedis.set("a","张三");
       //通过redis取值
        System.out.println(jedis.get("a"));
        jedis.mset("name","张三","password","admin");
        List<String> list = jedis.mget("name","password");
        System.out.println(list.toString());
        jedis.append("name","丰");
        System.out.println(jedis.get("name"));
        jedis.close();
}
}

4.3.4使用jedis连接池连接redis服务器

public class JedisDemo02 {
    public static void main(String[] args) {
       //JedisPool
        JedisPool jedisPool = new JedisPool("192.168.82.188",6379);
      //通过连接池获取jedis对象
        Jedis jedis = jedisPool.getResource();
        //hash结构
        jedis.hset("user","username","张三");
        Map<String,String> map = new HashMap<String, String>();
        map.put("password","jbgsn");
        map.put("age","19");
        jedis.hmset("user",map);
        Map<String,String> map1 = jedis.hgetAll("user");
        System.out.println(map1.keySet()+"---"+map1.values());
        jedis.close();
}
}

5 Redis数据类型

5.1String

5.1.1 命令

5.1.1.1赋值

语法: set key value

127.0.0.1:6379>set name zhangsan 
ok

5.1.1.2取值

语法: get key

127.0.0.1:6379> get name
"zhangsan"

5.1.1.3取值并赋值

语法: Getset key value

127.0.0.1:6379>getset s2 22
"zhangsan"     
127.0.0.1:6379>get s2
"22"

5.1.1.4设置/获取多个键值

语法:

mset key value [ key value……]

mget key[ key……]

127.0.0.1:6379>mset k1 v1 k2 v2 k3 v3
ok
127.0.0.1:6379>get k1
"v1"
127.0.0.1:6379>mget k1 k3
1)"v1"
2)"v3

5.1.1.5删除

语法:del key

127.0.0.1:6379>del name
(integer) 1

5.1.1.6 数值增减

incr 增加一

incrby

decr 减一

decrby

递增数字

当存储的字符串是整数时,redis提供一个实用的命令incr,其作用是让当前键值递增

并返回递增后的值。

语法:incr key(increment)

127.0.0.1:6379>incr num
(integer) 1
127.0.0.1:6379>incr num
(integer) 2
127.0.0.1:6379> incr num
(integer)3

增加指定的整数

语法:Incrby key increment

127.0.0.1:6379>incrby num2
(integer) 5
127.0.0.1:6379>incrby num2
(integer) 7
127.0.0.1:6379>incrby num2
(integer) 9

递减数值

语法:decr key

127.0.0.1:6379>decr num
(integer)9
127.0.0.1:6379>decr num
(integer)8

减少指定的整数

语法:decrby key decrement

127.0.0.1:6379>decr num
(integer)6
127.0.0.1:6379>decr num
(integer)5
127.0.0.1:6379>decrby num3
(integer)2
127.0.0.1:6379>decrby num3
(integer)-1

5.1.1.7 其它命令

5.1.1.7.1向尾部追加值

append的作用是向键值的末尾追加value。如果键不存在则将改键的值设置为value,

相当于set key value。返回值是追加后字符串的总长度。

语法:append key value

127.0.0.1:6379>set str hello
ok
127.0.0.1:6379> append str "world!"
(integer) 12
127.0.0.1:6379>get str
"hello world!"

5.1.1.7.2 获取字符串的长度

strlen命令返回键值的长度,如果键不存在则返回0

语法:strlen key

127.0.0.1:6379>strlen str
(integer) 0
127.0.0.1:6379> set str hello
ok
127.0.0.1:6379> strlen str
(integer)5

5.1.2应用

5.1.2.1自增主键

语法:incr 主键名

 5.2 Hash

散列类型

5.2.1 使用string的问题

假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:

保存、更新:User对象----json(String)----redis

如果在业务上只是更新age属性,其他的属性并不做更新我应该怎样做呢?

如果任然采用上边的方法在传输,处理时会造成资源浪费,hash可以很好的解决这个问题

如:user:username=“admin” ,password=“123456” ,age=18
使用string存储:
set user{username=“admin”,password=“123456”,age=18}
set user1{username="admin",password="123456",age="17"}
以上是浪费资源的方法

5.2.2redis hash 介绍

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型,

集合集合类型等其它类型。如下:

5.2.3 命令

5.2.3.1 赋值

Hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,

当执行更新操作时返回0.

语法:Hset key field value

127.0.0.1:6379>hset user username zhangsan
(integer) 1

一次可以设置多个字段值

语法:hmset key field value[field value……]

127.0.0.1:6379>hmset user age 20 username lisi
ok

当字段不存在赋值,类似hset,区别在于如果字段存在,该命令不执行任何命令

语法:hsetnx key filed value

127.0.0.1:6379>hsetnx user age 30  如果user中没有age字段则设置age为30,
否则不做任何操作
(integer)0

 

以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章

redis存储session配制方法

Redis实现分布式锁(设计模式应用实战)

Redis实现分布式锁(设计模式应用实战)

Redis缓存:java语言注释符号,附超全教程文档

spring boot 整合 redis

Redis 学习 —— 数据类型及操作