redis数据类型

redis中的数据一共五种数据类型:

  1. string(字符串类型 )
  2. hash类型(散列类型)
  3. list类型(列表类型)
  4. set (无序集合类型)
  5. zset(有序集合类型)

---------------------------------
string字符串类型:

set(key,value)-------存储数据

get(key)-------------取数据

mset(k1 v1 k2 v2)-------------同时存储多个键值对

mget(k1 k2)-------------------同时取得多个值

exists(key)--------------------判断是否存在某一个键

  • 在redis中,返回的是0,1  (0:不存在,1:存在)
  • 在jedis中,返回的是true,false

strlen key--------------------判断键对应的值的字符长度

incr key ------------------在当前值上+1(值为数值才可以)

incrby key  3 ------------------在当前值上+3(值为数值才可以)

decr key------------------------在当前值上-1

decrby key 3------------------------在当前值上-3

string类型,一个键,对应一个值

string类型的数据,在存储时,如果key的名称相同,后面的值,将会覆盖之前的值

---------------------------------------------------------------------------------------------------

hash  (散列类型)

hset 键  字段  值 --------------------存储一个hash类型的数据,一个键中包含一个字段,以及对应的值

  • hset stu  id 1
  • hset stu  name jack
  • hset stu  score 98

在使用hash类型存储数据时,如果键相同,字段名不同,它不会覆盖,只是给当前键,追加新的字段

hget 键  字段 ---------------------获得键中某一个字段的值

hmset  键  字段1 值1 字段2 值....  --------------给一个键,一次存储多个字段

  • 示例: hmset stu id 1 name jack score 98

hmget 键  字段1 字段2 字段3 -----------------一次获取多个字段值

hgetall 键 --------------获取所有字段值

hdel key  字段1 字段2----------可以删除一个或多个字段,返回值是被删除的字段个数 

HEXISTS key 字段-----------------判断key中,是否包含某一个字段

HKEYS key  ----------获得键中,所有的字段名

HVALS key------------获得键中,所有字段对应的值

HLEN key-------------获得当前键中,包含几个字段
---------------------------------------------------------------------------------------------

list 列表类型

这种列表是一种链表结构

  • 特点:允许存在重复数据,它存储数据时,是从两头存放

lpush  键名  a b c ----------------------添加一个列表,数据从左至右添加

rpush  键名  1  2  3---------------------向列表中添加数据,从右至左

lrange 键  0   -1-------------------------查看列表中的全部数据

LPOP key---------------------------从列表的左侧获得一个元素(取一个就会少一个)

RPOP key---------------------------从列表的右侧获得一个元素(取一个就会少一个)

LLEN key-----------------------------获得列表中的个数 
---------------------------------------------------------------------------------------

set 无序集合

特点:

  • 不能有重复数据
  • 数据是无序排序

sadd  键  a  b  c -----------------向集合存放数据

smembers 键---------------------取得集合中的全部数据

SISMEMBER 键  值----------------判断键所对应的集合是否存在某一个值

SPOP key------------------------从集合中随机弹出一个元素(弹出一个就会少一个)

  • 应用场景:随机抽奖,每一个人员只有一次机会

zset 有序集合

特点:        

  • 不能有重复数据
  • 数据是有序排序
  • 它在存储数据时,需要给每个元素指定一个分数,然后按分数进行排序

添加的数据

  • zadd  键    分数 元素1   分数   元素2
  • 示例: zadd  zset1  98 andy   99  chris  97  bruce

查看全部数据(不显示分数)  默认是升序排序

  • ZRANGE 键  0  -1

查看全部数据(显示分数)  默认是升序排序

  • ZRANGE 键  0  -1  withscores

查看全部数据(显示分数)  默认是降序排序

  • zrevRANGE 键  0  -1  withscores

----------------------------------------------------------------------------------------------------------------------

所有数据类型,都可以使用的方法

del 键 ---------------------------删除数据

flushall ------------------------清空所有键

keys * ---------------------------查看包含有哪些key

type 键 --------------------------查看当前的数据类型

exits 键--------------------------判断键是否存在

expire  键  秒----------------设置某一个key在redis中的存活时间  (如果不做设置,该键永远存在)

ttl 键 ---------------------------查看当前键,剩余的存活时间(秒)

----------------------------------------------------------------------------------------------------------------------

为什么要用redis?

答:项目使用 redis,数据可以存放缓存中,这样可以避免频繁访问数据库,减少频繁访问数据库给服务器的压力,这样可以缓解高并发环境下服务器承受的过大压力


项目中使用redis的步骤:

1、导入测试的示例(不存在redis的配置)

2、导入依赖    

        <!--jedis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.0</version>
        </dependency>
        
        
        <!--配置连接池的依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.3</version>
        </dependency>
        
        
        <!--导入jackson的三个依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.0</version>
        </dependency>

2、编写redis的配置文件

<!--配置redis连接池的配置信息-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	<property name="minIdle" value="50"/>
	<property name="maxIdle" value="200"/>
	<property name="maxTotal" value="1000"/>
	<property name="maxWaitMillis" value="3000"/><!--最大等待时间-->
	<property name="softMinEvictableIdleTimeMillis" value="10000"/><!--闲置连接超过上限,10秒后,将多余连接销毁-->
</bean>

<!--配置连接池-->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
	<property name="poolConfig" ref="jedisPoolConfig"/>
	<property name="host" value="192.168.112.137"/>
	<property name="port" value="6379"/>
</bean>

3、在web.xml文件中,加载spring配置文件 

  <servlet>
	<servlet-name>mvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
	  <param-name>contextConfigLocation</param-name>
	  <param-value>classpath:applicationContext*.xml</param-value>
	</init-param>
  </servlet>

4、编写redis的接口,包含一些常规方法

public void set(String key,String value);

public String get(String key);

public void hset(String key,String field,String value);

public String hget(String key,String field);

public void del(String key);

5、编写redis接口的实现类

@Autowired
    private JedisPool jedisPool;

    @Override
    public void set(String key, String value) {

        //通过连接池,获得Jedis对象
        Jedis jedis = jedisPool.getResource();

        jedis.set(key,value);

        jedis.close();


    }

    @Override
    public String get(String key) {
        Jedis jedis = jedisPool.getResource();

        String value = jedis.get(key);

        jedis.close();

        return value;
    }

    @Override
    public void hset(String key, String field, String value) {

        Jedis jedis = jedisPool.getResource();

        jedis.hset(key,field,value);

        jedis.close();


    }

    @Override
    public String hget(String key, String field) {

        Jedis jedis = jedisPool.getResource();

        String value = jedis.hget(key, field);

        jedis.close();

        return value;
    }

    @Override
    public void del(String key) {

        Jedis jedis = jedisPool.getResource();

        jedis.del(key);

        jedis.close();
    }

6、导入json工具类,用于解析json

package org.java.util;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtils {  
  

    private static final ObjectMapper MAPPER = new ObjectMapper();  
  
    /** 
     *
     * <p>Title: pojoToJson</p> 
     * <p>Description: </p> 
     * @param data 
     * @return 
     */  
    public static String objectToJson(Object data) {  
        try {  
            String string = MAPPER.writeValueAsString(data);  
            return string;  
        } catch (JsonProcessingException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
      

    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {  
        try {  
            T t = MAPPER.readValue(jsonData, beanType);  
            return t;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
      

    public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {  
        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);  
        try {  
            List<T> list = MAPPER.readValue(jsonData, javaType);  
            return list;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
          
        return null;  
    }  
      
}  
  1. 可以将对象、集合转换成json,方便存储到redis
  2. 可以将redis的json数据,还原成对象、集合在页面中呈现

7、在service层(业务层),在查询数据库之前,首先判断redis中有没有数据,如果有,就直接返回redis的数据,不再查询数据库。如果没有,就查询数据库,并且将查询到的结果,放在redis中
 

package org.java.service.impl;

import org.java.dao.PrdMapper;
import org.java.entity.Prd;
import org.java.redis.RedisClient;
import org.java.service.PrdService;
import org.java.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class PrdServiceImpl implements PrdService {
    @Autowired
    private PrdMapper mapper;

    @Autowired//注入redis接口
    private RedisClient redisClient;

    @Override
    public List<Prd> getList() {

        //首先判断redis中有没有需要数据
        String json = redisClient.hget("redis_j54_singleton", "getList");

        //判断是否存在数据
        if(StringUtils.isEmpty(json)){

            System.out.println("==================数据来自至于database============");

            //redis没有缓存,准备查询关系型数据库
            List<Prd> list = mapper.getList();

            //将集合序列化成json格式的字符串
            json = JsonUtils.objectToJson(list);

            //将查询到的结果,存放到缓存中
            redisClient.hset("redis_j54_singleton","getList",json);

            return list;


        }else{
            System.out.println("==================数据来自至于redis============");
            //有缓存数据,可以将json数据,转换成集合
            List<Prd> list = JsonUtils.jsonToList(json, Prd.class);
            return list;
        }
    }

    @Override
    public Prd findById(String pid) {

        //判断缓存中是否存在数据
        String json = redisClient.hget("redis_j54_singleton",pid);
        if(StringUtils.isEmpty(json)){
            //缓存中不存在,准备查询数据库
            System.out.println("==================数据来自至于database============"+pid);

            Prd prd = mapper.findById(pid);
            //将对象,存放到缓存
            json =  JsonUtils.objectToJson(prd);

            redisClient.hset("redis_j54_singleton",pid,json);

            return prd;
        }else{
            System.out.println("==================数据来自至于redis============"+pid);
            //缓存中存在
            //将json转换成PRD
            Prd prd = JsonUtils.jsonToPojo(json, Prd.class);
            return prd;

        }
    }
}

Redis支持多种数据类型,包括string、hash、list、set和sorted set等。其中,string是最基本、最简单的数据类型,用于存储字符串。 Hash是用于存储键值对的数据结构,其中的value只能存储字符串,不允许存储其他数据类型,也不存在嵌套现象。每个hash可以存储232 - 1个键值对,并可以灵活添加或删除对象属性。但需要注意的是,hash类并不适合存储大量对象,也不应该将hash作为对象列表使用,因为遍历整体数据的效率可能会较低。 除了string和hash类Redis还支持list、set和sorted set数据类型。List是一个有序的字符串列表,可以进行插入、删除和查找等操作。Set是一个无序的字符串集合,可以进行元素的添加、删除和查找操作,并且不允许重复元素的存在。Sorted Set是一个有序的字符串集合,每个元素都有一个对应的score,可以根据score进行排序和范围查找。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis 数据类型](https://blog.csdn.net/weixin_52851967/article/details/122670564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值