Redis非关系数据库

版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!

前言篇

1. NoSql概述

为什么需要 NOSQL?

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

主流NoSQL产品:

NOSQL数据库的四大分类:

◆键值(Key-Value)存储
◆列存储
◆文档数据库
◆图形数据库

NoSql的特点:

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

Redis概述

高性能键值对数据库支持的键值数据类型:

◆字符串类型
◆散列类型
◆列表类型
◆集合类型
◆有序集合类型

Redis的应用场景:

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

配置篇

2.安装环境

redis是C语言开发,安装redis需要先将下载的源码进行编译,依赖gcc环境。
如果没有gcc环境,要安装gcc:指令:yun install gcc-c++ 如果提示是否下载,输入y下载

2.1下载并安装:

(1)下载: wget http://download.redis.io/releases/redis-3.0.7.tar.gz (下载你喜欢的版本)

(2) 解压缩:tar -zxzf redis-3.0.7.tar.gz(注意你的版本名称)

(3) cd redis-3.0.7

默认路径执行:sudo make&make install

指定到其他路径:make完后 执行 make PREFIX=/usr/local/redis install,然后将 cp redis.conf /usr/local/redis也复制到该目录下

切换到 redis/src 目录下可以查看到redis服务程序redis-server,还有用于测试的客户端程序redis-cli

启动redis服务: ./redis-server

注意:这种方式启动redis称为前端启动 使用的是默认配置,将不能接受linux命令,需要 ctrl+c停止后方可。

我们需要后端启动:修改redis.conf 将daemonize 修改为 yes

保存退出:wq

通过启动参数告诉redis使用指定配置文件使用下面命令启动。

进入src执行 ./redis-server ../redis.conf 这种方式启动不会影响你操作其他指令。

ps -ef | grep redis 查看是否启动

root   7696  1  0 16:12 ?00:00:00 ./redis-server *:6379   
root   7726   3823  0 16:12 pts/000:00:00 grep redis

关闭指令:在src目录下执行 ./redis-cli shutdown即可,或者:kill -9 任务进程号

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

$ ./redis-cli
redis> set name zzh
OK
redis> get name
"zzh"

3.Jedis介绍

◆ Jedis是 Reids官方首选的Java客户端开发包。

◆ 下载地址:https://github.com/xetorthio/jedis

(1) 连接验证:在工程中加入下载好的jedis的jar包,如果是Maven项目可以直接在pom.xml中加入jedis包驱动 如:

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

(2) 测试代码:

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class Tests {

public static void main(String args[]){

    testSingle();
    testPool();
}
//单实例的测
public static void testSingle() {
    //1,设置IP地址和口
    Jedis jedis = new Jedis("192.168.11.133", 6379);
    //2.保存数据:
    jedis.set("name", "zzh");
    //3,获取数据
    String value = jedis.get("name");
    System.out.println(value);
    //4,释放资源
    jedis.close();
}
//连接池的测
public static void testPool() {
    //获得连接池的配图对象:
    JedisPoolConfig config = new JedisPoolConfig();
    //设置最大连接数
    config.setMaxTotal(30);
    //设最大空闲连接数:
    config.setMaxIdle(10);
    //获得连接池
    JedisPool jedispool = new JedisPool(config, "192.168.11.133", 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.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect 则需要配置端口防火墙

执行:vim /etc/sysconfig/iptables

添加一行你ps -ef | grep redis 查询后的redis端口号,如:

保存退出:执行service iptables restart 重启防火墙,再次运行程序即可的到结果。

语法篇

4.Redis的数据结构

五种数据类型:

◆字符串(String)
◆哈希(hash)
◆字符串列表(list)
◆字符串集合(set)
◆有序字符串集合(sorted set)

4.1 存储 String

◆二进制存储安全的,存入和获取的数据相同

◆ Value最多可以容纳的数据长度是512M

操作与运算:

(1)添加key并设置值: set key value;
(2)通过key获取值: get key;
(3)查看所有的key:keys *;
(4)删除key和内容:del key;
(5)数字类型字符串加一:incr num;
(6)数字类型字符串减一:decr num;
(7)获取范围值:getrange 如键 hello的值是 word,则 getrange 0 2 则返回 wor 字符串
(8)设置值前先获得值:getset 如键 a 的值是 hello 则 getset a word 返回hello 的值,实际键a值修改为word 了。

扩展命令:

(7) incrby num 5 (意思->num=num+5)
(8) decrby num 5 (意思->num = num-5)
:如果有num字段 则在在num进行增减,如果没有会自动初始化num=0

(9) 拼接:append num 5 (意思->num = num+"5",假如 num=2,则结果为:"25") 注:该条命令,如果num不存在,则将"5" 赋值给num,即:num="5"

4.2存储Hash

◆String Key和String Value的map容器
◆每一个Hash可以存储4294967295个键值对

操作与运算:

(1)添加key并设置值: hset/hmset mapname key value;

注:hmset表示一次添加多个key ,value

例:

hset myhash username zhengzaihong //添加一个key 和value

hmset myhash2 username liuqi age 22 //同时添加多个key和value

(2)通过key获取值: hget/hmget mapName key;

hmget 表示一次可以获取多个属性的值(key)

例:

   hget myhash username //结果会输出:"zhengzaihong"

   hmget myhash2 username age //结果会输出:
                               1)"liuqi" 
                               2)"22"

(3)查看所有的key和value: hgetall ; 如:hgetall myhash2 将列出该Hash存储的全部的键和值

(4)删除一个或多个key和内容:hdel mapname key key1 key2;删除整个字典 del mapname,如:del myhash2

(5) hincrby mapname num 5 (意思->取出mapname中key为num,然后运算 num=num+5)

(6) hdecrby mapname num 5 (意思->取出mapname中key为num,然后运算 num = num-5)

(7)判断一个属性是否存在:hexists mapname key,如:hexists myhash2 sex,如果存在则返回,(integer)1 否则:(integer)0

(8)获取hashMap的长度:hlen mapname,如hlen myhash2

(9)获取hashMap所有的key:hkeys mapname;

(10)获取hashMap所有的value:hvals mapname;

存储list :

◆ Arraylistf使用数组方式
◆ Linkedlist使用双向链接方式
◆ 双向链表中增加数据
◆ 双向链表中删除数据

存储ist常用命:

头部添加:lpush listname value,如:lpush mylist a b c 则c在头部

尾部添加:rpush listname value,如:rpush mylist2 a b c 则c在最尾部

查看list集合: lrange listname 下标起始位 下标结束位,如:lrange mylist 0 2

左边弹出:lpop listname,如:lpop mylist 则将mylist最左边的c弹出,此时mylist也将不在有该值

右边弹出:rpop listname,如:lpop mylist2 则将mylist2最右边的c弹出,此时mylist2也将不在有该值

获取list长度,llen listname

扩展命令:
头部插入:lpushx listname value,如果listname该集合存在则在该集合上插入value值,value值位于最顶端。
尾部插入:rpushx listname value,如果listname该集合存在则在该集合上插入value值,value值位于最末端。

删除元素:

头部删除:lrem listname "删除个数" "删除value",如:lrem mylist 1 c 指从头部开始删除一个值为c的元素。

尾部删除:lrem listname "倒数第几位开始" "value" 如:lrem mylist -3 a 指从尾部开始删除一个值为a的元素。

插入元素:lset listname "下标位置" "value"
之前/之后插入:linset listname before/after "被插值" "插入值"

重一个集合的末端取出到存入一个集合顶端:rpoplpush listname1 listname2 如图:

存储Set

◆和List类型不同的是,Set集合中不允许出现重复的元素
◆Set可包含的最大元素数量是4294967295

存储set常用命令:

sadd myset a b c //向myset添加a,b,c元素

srem myset 1 2 //删除myset中1,2元素

smembers myset //查看set集合元素

sismember myset a //判断 a 元素是否是集合 myset的成员

sdiff mya1 myb1 //返回mya1和myb1集合的差集

sinter mya2 myb2 //返回给定所有集合的交集

sunion mya3 myb3//返回所有给定集合的并集

scard myset //返回集合的size大小

srandmember myset [count] //返回集合中一个或多个随机数

sdiffstore my1 mya1 myb1 //返回给定mya1, myb1 集合的差集并存储在 my1 中

sinterstore my2 mya2 myb2 //返回给定mya2和 myb2集合的交集并存储在 my2 中

sunionstore my3 mya3 myb3 //所有给定mya3 和myb3集合的并集存储在 my3 集合中

存储 Sorted-Set

◆ Sorted-Set和Set的区别

◆ Sorted-Set中的成员在集合中的位置是有序的

zadd mysort 70 zs 80 ls 90 ww //向有序集合添加一个或多个成员,或者更新已存在成员的分数( zadd key score1 member1 [score2 member2])

zscore mysort zs //查看zs的分数

zcard mysort //获取有序集合的成员数

zrem mysort tom ww //删除tom 和ww信息

zrange mysort 0 -1 //通过索引区间返回有序集合成指定区间内的成员,0到-1指从第一个元素到最后一个

zrevrange mysort 0 -1 withscores //返回有序集中指定区间内的成员,通过索引,分数从高到底

zremrangebyrank mysort 0 4 //移除有序集合中给定的排名区间的所有成员

zremrangebyscore mysort 80 100 //移除有序集合中给定的分数区间的所有成员

zrangebyscore mysort 0 100 //通过分数返回有序集合指定区间内的成员

Redis key通用命令

1、dump key 序列化给定的key并返回序列化的值
2、exists key 检查给定的key是否存在
3、expire key seconds 为key设置过期时间
4、expire key timestamp 用时间戳的方式给key设置过期时间
5、pexpire key milliseconds 设置key的过期时间以毫秒计
6、keys pattern 查找所有符合给定模式的key
7、move key db 将当前数据库的key移动到数据库db当中
8、persists key 移除key的过期时间,key将持久保存
9、pttl key 以毫秒为单位返回key的剩余过期时间
10、ttl key 以秒为单位,返回给定key的剩余生存时间
11、randomkey 从当前数据库中随机返回一个key
12、rename key newkey 修改key的名称
13、renamenx key newkey 仅当newkey不存在时,将key改名为newkey
14、type key 返回key所存储的值的类型
15、del key 删除key
16、setnx key newvalue 仅当key 不存在时设置才会成功
17、strlen 返回字符的长度

Redis事务

1、discard 取消事务,放弃执行事务块内的所有命令。
2、exec 执行所有事务块内的命令。
3、multi 标记一个事务块的开始。
4、unwatch 取消 WATCH 命令对所有 key 的监视。
5、watch key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

更多指令官方文档https://redis.io/commands

看观们请注意本篇内容早在2017年所写,学习的小伙伴们请根据最新文档参照学习。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容