Redis学习一(简介,特性,应用场景,优势,快,安装,五种基本数据类型及操作)

目录

         Redis的简介:

Redis特性

Redis应用场景

为什么使用Redis?

单线程redis为什么这么快?

Redis安装

Redis的五种数据类型

非数据类型常用命令

String 类型常用命令

List 类型常用命令

Set 类型常用命令

Hash 类型常用命令

Zset 类型常用命令(去重+排序)

 使用IDEA连接Redis

 

Redis的简介:

是一个开源的使用C语言编写,支持网络,可基于内存亦可持久化的日志key-value数据库[非关系型数据库]。并支持多种语言的API。 注意:非关系型数据库  mysql,oracle,sqlserver,db2关系型数据库。

Redis特性

Redis远程的:分为客户端,服务端。可以分别部署在不同的机器上,通过自定义协议进行传输和交互的。平时说的Redis通常指的是Redis的服务端。

Redis基于内存的:所有数据结构存在内存中。所有操作非常高速。性能优越于硬盘存储的mysql,因为存在内存中,所有也是比较吃内存的。

Redis 非关系型数据库:本质是数据库,存储数据,区别于Mysql。

关系型数据库在存储之前,必须要定义好所谓的数据字典,后续的存储数据按照存储字典来存储,而Redis就不需要了。

Redis应用场景

1.缓存:当系统的接口数据比较慢的时候,可以把系统数据接口的数据缓存起来,当下次取的时候,可以直接从缓存中取就可以了。

2.数据存储:redis有两种非常完备的持久化机制【AOF和RDB】,可以定期将数据持久化硬盘中,保障数据的完整性,安全性。

为什么使用Redis?

们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

单线程redis为什么这么快?

(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O
多路复用机制

Redis安装

进入目录之后,需要make 一下,如果报错的话说明c语言环境没有安装,在联网的情况下使用yum安装,gcc 和 g-c++,命令如下,安装完成后,可以查看一下半版信息:

yum -y install gcc

yum -y install gcc-c++

gcc -v
g++ -v

 之后,在次make一下,如果把报错的话,使用 make distcelan命令之后,在make。在,make成功之后,执行make install命令,以上的命令分别如下:

make distclean

make 

make install

在所有的操作都成功了之后,可以查看redis的默认安装目录。

 如下:

[root@redis99 bin]# ll
总用量 26348
-rwxr-xr-x. 1 root root 5580351 10月 29 12:37 redis-benchmark
-rwxr-xr-x. 1 root root   22225 10月 29 12:37 redis-check-aof
-rwxr-xr-x. 1 root root 7829890 10月 29 12:37 redis-check-rdb
-rwxr-xr-x. 1 root root 5709219 10月 29 12:37 redis-cli
lrwxrwxrwx. 1 root root      12 10月 29 12:37 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 7829890 10月 29 12:37 redis-server

 之后就可以启动redis的服务了,使用如下的命令:

redis-server

 一般的需要设置redis为后台启动:

 

 

 

 如果你想要使用window中的客户端访问linux下一些服务程序,比如说Redis的服务的话,必须在Linux下的该服务的端口,在防火墙中对于放行,或者直接关闭防火墙、

 

Redis的五种数据类型

String :

  • 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 Map key-value
    1. String str = “hello”;  redis key – value  String s = new String(“”);
  • String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
  • String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M.

List:

  • 单键多值
  • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

Hash:

  • Redis  hash 是一个键值对集合。
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • 类似Java里面的Map<String,Object>

 

 

Zset:

  • Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score,这个评分(score被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
  • 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

使用场景:

数据类型

项目中的应用

String

字符串

比如说当一个ip地址访问网站超过了预定的次数,可以禁止访问,则这个预定次数就可以使用String来存储

List

列表

实现最新消息信息排列展示【消息队列】

Set

集合

特殊之处在于set是可以自动排重的。比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。  

Hash

散列

存储用户信息:key(用户ID) + field(属性标签操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题

Zset

有序集合

以某个条件为权重,比如按顶的次数排序。

需要精准设定过期时间的应用  

使用sorted set的设置过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据。

非数据类型常用命令

  1. 切换库
    1. select 0
  2. 启动服务器,用客户端访问
    1. ./redis-server redis.conf
    2. ./redis-cli
  3. 测试验证连接是否正常
    1. ping
  4. 查看当前库的所有键
    1. keys *
  5. 判断key是否存在
    1. exists <key>
  6. 查看键的类型
    1. type  <key>  
  7. 删除某个键
    1. del <key>
  8. 设置key的过期时间单位为 秒
    1. expire   <key>   <seconds>
  9. 查看还有多少秒过期,-1表示永不过期,-2表示已过期
    1. ttl <key>
  10. 查看当前数据库的key的数量
    1. dbsize
  11. 清空当前库
    1. flushdb
  12. 通杀全部库
    1. flushall
127.0.0.1:6379> exists s1
(integer) 0
127.0.0.1:6379> exists s2
(integer) 1
127.0.0.1:6379> type s2
set
127.0.0.1:6379> del s2
(integer) 1
127.0.0.1:6379> del s1
(integer) 0
127.0.0.1:6379> del s100
(integer) 0
127.0.0.1:6379> expire s2 10
(integer) 0
127.0.0.1:6379> ttl s2
(integer) -2
127.0.0.1:6379> ttl s2
(integer) -2
127.0.0.1:6379> exists s2
(integer) 0
127.0.0.1:6379> exists s3
(integer) 0
127.0.0.1:6379> exists s4
(integer) 0
127.0.0.1:6379> exists s1
(integer) 0
127.0.0.1:6379> exists l1
(integer) 1
127.0.0.1:6379> expire l1 10
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 4
127.0.0.1:6379> ttl l1
(integer) 3
127.0.0.1:6379> ttl l1
(integer) 2
127.0.0.1:6379> ttl l1
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 0
127.0.0.1:6379> ttl l1
(integer) -2
127.0.0.1:6379> dbsize
(integer) 13
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> flushall
OK

String 类型常用命令

  1. 添加键值对
    1. set <key>
  2. 查询对应键值
    1. get <key>
  3. 将给定的<value> 追加到原值的末尾
    1. append  <key>  <value>
  4. 获得值的长度
    1. strlen <key>
  5. 只有在 key 不存在时设置 key 的值
    1. setnx  <key>  <value>
  6. 将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1
    1. incr  <key>
  7. 将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1
    1. decr  <key>
  8. 将 key 中储存的数字值增减。自定义步长。
    1. incrby / decrby  <key>  <步长>
  9. 同时设置一个或多个 key-value对 
    1. mset  <key1>  <value1>  <key2>  <value2>  .....
  10. 同时获取一个或多个 value 
    1. mget  <key1>   <key2>   <key3> .....
  11. 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
    1. msetnx <key1>  <value1>  <key2>  <value2>  .....
  12. 获得值的范围
    1. getrange  <key>  <起始位置>  <结束位置>   
  13. 用 <value>  覆写<key> 所储存的字符串值,从<起始位置>开始。
    1. setrange  <key>   <起始位置>   <value>
  14. 设置键值的同时,设置过期时间,单位秒。
    1. setex  <key>  <过期时间>   <value>
  15. 以新换旧,设置了新值同时获得旧值
    1. getset <key>  <value>
127.0.0.1:6379> set s1 v1
OK
127.0.0.1:6379> get s1
"v1"
127.0.0.1:6379> append s1 hello
(integer) 7
127.0.0.1:6379> get s1
"v1hello"
127.0.0.1:6379> append s2 world
(integer) 5
127.0.0.1:6379> strlen s2
(integer) 5
127.0.0.1:6379> setnx s2 isea 
(integer) 0
127.0.0.1:6379> get s2
"world"
127.0.0.1:6379> setnx s3 isea
(integer) 1
127.0.0.1:6379> get s3
"isea"
127.0.0.1:6379> incr s4
(integer) 1
127.0.0.1:6379> get s4
"1"
127.0.0.1:6379> incr 
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incr s5 2
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incr s5 1
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set s6 3
OK
127.0.0.1:6379> incr s6
(integer) 4
127.0.0.1:6379> decr s6
(integer) 3
127.0.0.1:6379> incrby s7 5
(integer) 5
127.0.0.1:6379> get s7
"5"
127.0.0.1:6379> incrby s7 5
(integer) 10
127.0.0.1:6379> mset s8 v8 s9 v9 s10 v10
OK
127.0.0.1:6379> mget s8 s9 s9
1) "v8"
2) "v9"
3) "v9"
127.0.0.1:6379> msetnx ss1 v1 ss2 v2
(integer) 1
127.0.0.1:6379> get ss1 ss2
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> mget ss1 ss2
1) "v1"
2) "v2"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name isea_you
OK
127.0.0.1:6379> getrange name 0 -1
"isea_you"
127.0.0.1:6379> getrange name 0 3
"isea"
127.0.0.1:6379> setrange name 0 ifsea
(integer) 8
127.0.0.1:6379> get name
"ifseayou"
127.0.0.1:6379> setex age 10 23
OK
127.0.0.1:6379> ttl age
(integer) 7
127.0.0.1:6379> ttl age
(integer) 6
127.0.0.1:6379> ttl age
(integer) 5
127.0.0.1:6379> ttl age
(integer) 4
127.0.0.1:6379> ttl age
(integer) 2
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> getset name hailong
"ifseayou"
127.0.0.1:6379> get name
"hailong"

List 类型常用命令

  1. 从左边/右边插入一个或多个值。
    1. lpush/rpush  <key>  <value1>  <value2>  <value3> ....
  2. 从左边/右边吐出一个值。值在键在,值光键亡
    1. lpop/rpop  <key>
  3. 按照索引下标获得元素(从左到右) 元素不会丢失!
    1. lrange <key> <start> <stop>
  4. 获得列表长度
    1. llen <key>
  5. 在<value>的后面插入<newvalue> 插入值
    1. linsert <key>  before <value>  <pivot>  <newvalue>
127.0.0.1:6379> lpush l1 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> lpop l1
"v4"
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange l1 0 2
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange l1 0 1
1) "v3"
2) "v2"
127.0.0.1:6379> llen l1
(integer) 3
127.0.0.1:6379> linsert l1 before 2 isea_you
(integer) -1
127.0.0.1:6379> llen l1
(integer) 3
127.0.0.1:6379> linsert l1 before v2 isea_you
(integer) 4
127.0.0.1:6379> linsert l1 after v2 ifseayou
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "isea_you"
3) "v2"
4) "ifseayou"
5) "v1"
127.0.0.1:6379> 

Set 类型常用命令

  1. 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
    1. sadd <key>  <value1>  <value2> .....  
  2. 取出该集合的所有值。
    1. smembers <key>
  3. 判断集合<key>是否为含有该<value>值,有返回1,没有返回0
    1. sismember <key>  <value>
  4. 删除集合中的某个元素。
    1. srem <key> <value1> <value2> ....
  5. 随机从该集合中吐出一个值。
    1. spop <key> 
  6. 随机从该集合中取出n个值,不会从集合中删除。
    1. srandmember <key> <n>
  7. 返回两个集合的交集元素。
    1. sinter <key1> <key2> 
  8. 返回两个集合的并集元素。
    1. sunion <key1> <key2> 
  9. 返回两个集合的差集元素,返回的结果跟key的顺序有关系
    1. sdiff <key1> <key2> 
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 m1 m2 m3 m4 m5 m6
(integer) 6
127.0.0.1:6379> smembers s1
1) "m1"
2) "m3"
3) "m2"
4) "m5"
5) "m6"
6) "m4"
127.0.0.1:6379> sismember s1 m4
(integer) 1
127.0.0.1:6379> srem s1 m3 m1
(integer) 2
127.0.0.1:6379> smembers s1
1) "m5"
2) "m6"
3) "m4"
4) "m2"
127.0.0.1:6379> spop s1 2
1) "m2"
2) "m5"
127.0.0.1:6379> smembers s1
1) "m6"
2) "m4"
127.0.0.1:6379> srandmember s1 2
1) "m4"
2) "m6"
127.0.0.1:6379> sadd s2 m1 m2 m3 m4 m5 m6 m7 m8
(integer) 8
127.0.0.1:6379> sinter s1 s2
1) "m6"
2) "m4"
127.0.0.1:6379> sunion s1 s2
1) "m8"
2) "m3"
3) "m5"
4) "m6"
5) "m4"
6) "m7"
7) "m1"
8) "m2"
127.0.0.1:6379> sdiff s1 s2
(empty list or set)
127.0.0.1:6379> sdiff s2 s1
1) "m7"
2) "m5"
3) "m3"
4) "m8"
5) "m1"
6) "m2"

Hash 类型常用命令

  1. 给<key>集合中的  <field>键赋值<value>
    1. hset <key>  <field>  <value>
  2. 从<key1>集合<field> 取出 value
    1. hget <key1>  <field>
  3. 批量设置hash的值
    1. hmset <key1>  <field1> <value1> <field2> <value2>...  
  4. 批量取出hash的值
    1. hmget <key1>  <field1> <field2>...  
  5. 查看哈希表 key 中,给定域 field 是否存在。 有返回1,没有返回0
    1. hexists key  <field>
  6. 列出该hash集合的所有field
    1. hkeys <key>
  7. 列出该hash集合的所有value

            hvals <key> 

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset h1 name isea_you
(integer) 1
127.0.0.1:6379> hset h2 age 20
(integer) 1
127.0.0.1:6379> hget h1 name
"isea_you"
127.0.0.1:6379> hget h2 age
"20"
127.0.0.1:6379> hmset h3 name isea_you age 20 sex boy
OK
127.0.0.1:6379> hmget h3 name age sex
1) "isea_you"
2) "20"
3) "boy"
127.0.0.1:6379> hexists h3 name
(integer) 1
127.0.0.1:6379> hkeys h3
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals h3
1) "isea_you"
2) "20"
3) "boy"
127.0.0.1:6379> flushdb
OK

Zset 类型常用命令(去重+排序)

评分能够重复。

  1. 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
    1. zadd  <key> <score1> <value1>  <score2> <value2>...
  2. 返回有序集 key 中,下标在<start> <stop>之间的元素带WITHSCORES,可以让分数一起和值返回到结果集。
    1. zrange <key>  <start> <stop>  [WITHSCORES] 
      •  WITHSCORES 如果在命令行上加上该选项,则将score 和 value 一同取出,如果不加该选项,则只取value值!
  3. 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
    1. zrangebyscore key min max [withscores] [limit offset count]
    2. zrevrangebyscore key max min [withscores] [limit offset count] 从大到小
  4. 为元素的score加上增量
    1. zincrby <key> <increment> <member>
  5. 删除该集合下,指定值的元素
    1. zrem  <key>  <value> 
  6. 统计该集合,分数区间内的元素个数
    1. zcount <key>  <min>  <max>
  7. 返回该值在集合中的排名,从0开始。
    1.  zrank <key>  <value>
127.0.0.1:6379> zadd z1 100 java 90 html 96 css 78 node.js 99 php
(integer) 5
127.0.0.1:6379> zrange z1 0 -1
1) "node.js"
2) "html"
3) "css"
4) "php"
5) "java"
127.0.0.1:6379> zrange z1 0 -1 withscores
 1) "node.js"
 2) "78"
 3) "html"
 4) "90"
 5) "css"
 6) "96"
 7) "php"
 8) "99"
 9) "java"
10) "100"
127.0.0.1:6379> zrevrange z1 0 -1 withscores
 1) "java"
 2) "100"
 3) "php"
 4) "99"
 5) "css"
 6) "96"
 7) "html"
 8) "90"
 9) "node.js"
10) "78"
127.0.0.1:6379> zrangebyscore z1 80 100 withscores
1) "html"
2) "90"
3) "css"
4) "96"
5) "php"
6) "99"
7) "java"
8) "100"
127.0.0.1:6379> zrangebyscore z1 80 100 
1) "html"
2) "css"
3) "php"
4) "java"
127.0.0.1:6379> zrevrangebyscore z1 80 100 
(empty list or set)
127.0.0.1:6379> zrevrangebyscore z1 100 80 
1) "java"
2) "php"
3) "css"
4) "html"
127.0.0.1:6379> zincrby z1 -40 java
"60"
127.0.0.1:6379> zrevrange z1 0 -1 withscores
 1) "php"
 2) "99"
 3) "css"
 4) "96"
 5) "html"
 6) "90"
 7) "node.js"
 8) "78"
 9) "java"
10) "60"
127.0.0.1:6379> zcount z1 60 80
(integer) 2
127.0.0.1:6379> zrank z1 php
(integer) 4
127.0.0.1:6379> flushdb
OK

 使用IDEA连接Redis

package com.isea.redis;

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

public class TestRedis {
    @Test
    public void connectionTest(){
        Jedis jd = new Jedis("192.168.1.103",6379);
        System.out.println(jd.ping());
        jd.set("name","isea_you");
        jd.set("age","20");
        System.out.println(jd.get("name"));
    } 
    /*
    PONG
    isea_you
    */
}
package com.isea.redis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class TestRedis {
    JedisPool jedisPool = null;
    Jedis jedis = null;


    @Before
    public void init(){
         jedisPool = new JedisPool("192.168.1.103",6379);
         jedis = jedisPool.getResource();
    }

    @Test
    public void connectionTest(){
        System.out.println(jedis.ping());
        jedis.set("name","isea_you");
        jedis.set("age","20");
        System.out.println(jedis.get("name"));
    }

    @After
    public void close(){
        jedis.close();
        jedisPool.close();
    }
    /*
    PONG
    isea_you
    */
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值