C#对Redis 的操作

redis 的连接

public class RedisHelper
{
    string _ip = string.Empty;
    int _port = 0;
    string _password = string.Empty;
    public RedisHelper(string ip, int port, string password=null)
    {
        _ip = ip;
        _port = port;
        _password = password;
    }

    private ConnectionMultiplexer _redisConn;

    public ConnectionMultiplexer RedisConn
    {
        get
        {
            try
            {
                if (!IsConnected())
                {
                    ConfigurationOptions Configuration = new ConfigurationOptions
                    {
                        EndPoints = { $"{_ip}:{_port.ToString()}" },
                        Password = _password
                    };
                    _redisConn= ConnectionMultiplexer.Connect(Configuration);
                }
            }
            catch (Exception ex) 
            {
                throw ex;
            }
            return _redisConn;
        }
    }

    /// <summary>
    /// 获取redis的连接状态
    /// </summary>
    /// <returns></returns>
    public  bool IsConnected()
    {
        return _redisConn?.IsConnected ?? false;
    }
}

Redis存入数据库的选择

using (ConnectionMultiplexer conn = redis.RedisConn)
{
 // 获取数据库实例,这里选择 db4,共16个数据库,可以选择0~15任意一个
 var db = conn.GetDatabase(4);
}

Redis的5种数据类型的写入和读取

string类型

using (ConnectionMultiplexer conn = redis.RedisConn)
{
    string key = "test1";
    // 获取数据库实例,这里选择 db4
    var db = conn.GetDatabase(4);
    if (db.KeyExists(key))
    {
        db.KeyDelete(key);
    }
    db.StringSet(key, DateTime.Now.ToString());

    MessageBox.Show(db.StringGet(key));
}

string 类型的数据

HashSet 类型

using (ConnectionMultiplexer conn = redis.RedisConn)
{
    string key = "WHSUS_HashSet";
    var db = conn.GetDatabase(4);
    if (db.KeyExists(key))
    {
        db.KeyDelete(key);
    }
    for (int i = 0; i < 5; i++)
    {
        UserInfoDto userInfo = new UserInfoDto();
        userInfo.Id = i;
        userInfo.LastLoginTime = DateTime.Now;
        userInfo.Password = "1234789" + i;
        userInfo.StaffId = "7894" + i;
        userInfo.StaffName = "Test" + i;
        db.HashSet(key, userInfo.Id, JsonConvert.SerializeObject(userInfo));
    }
    RedisValue redisValue = db.HashGet(key, 4);
    UserInfoDto userInfo1 = new UserInfoDto();
    userInfo1 = JsonConvert.DeserializeObject<UserInfoDto>(redisValue);
    MessageBox.Show(userInfo1.StaffName);
}

HashSet类型的数据

Set 类型

using (ConnectionMultiplexer conn = redis.RedisConn)
{
    string keyPrefix = "WHSUS_Set";
    var db = conn.GetDatabase(4);
    for (int i = 0; i < 5; i++)
    {
        UserInfoDto userInfo = new UserInfoDto();
        userInfo.Id = i;
        userInfo.LastLoginTime = DateTime.Now;
        userInfo.Password = "1234789_" + i;
        userInfo.StaffId = "7894_" + i;
        userInfo.StaffName = "Test_" + i;
        db.KeyDelete(keyPrefix + userInfo.Id);
        db.SetAdd(keyPrefix + userInfo.Id + ":id", userInfo.StaffId);
        db.SetAdd(keyPrefix + userInfo.Id + ":name", userInfo.StaffName);
    }

    // exists  和 flag 都是false 
    bool exists = db.KeyExists($"WHSUS_Set2");
    bool flag= db.KeyDelete($"WHSUS_Set2");

    RedisValue[] redisValuesId = db.SetMembers($"{keyPrefix}2:id");
    RedisValue redisValueId = db.SetMembers($"{keyPrefix}2:id").FirstOrDefault();
    string name = redisValueId;

    #region 模糊匹配
    List<string> keys = new List<string>();
    var server = db.Multiplexer.GetServer(db.Multiplexer.GetEndPoints()[0]);
    foreach (var key in server.Keys(db.Database, $"{keyPrefix}0*"))
    {
        keys.Add(key);
    }
    foreach (var item in keys)
    {
        RedisValue value = db.SetMembers(item).FirstOrDefault();
        db.KeyDelete(item);
    }
    #endregion
}

Set类型的数据

List 类型

using (ConnectionMultiplexer conn = redis.RedisConn)
{
    if (redis.IsConnected())
    {
        string key = "WHSUS_ListTest";
        var db = conn.GetDatabase(4);
        if (db.KeyExists(key))
        {
            db.KeyDelete(key);
        }
        List<UserInfoDto> users = new List<UserInfoDto>();
        // 类似队列压入、取出
        for (int i = 0; i < 5; i++)
        {
            UserInfoDto userInfo = new UserInfoDto();
            userInfo.Id = i;
            userInfo.LastLoginTime = DateTime.Now;
            userInfo.Password = "1234789" + i;
            userInfo.StaffId = "7894" + i;
            userInfo.StaffName = "Test" + i;
            users.Add(userInfo);
            //db.ListLeftPush(key, $"test——{i}");
            db.ListLeftPush(key, $"{JsonConvert.SerializeObject(userInfo)}");
        }
        while (db.ListLength(key) != 0)
        {
            RedisValue redisValue = db.ListLeftPop(key);
        }

        //一次取出所有
        RedisValue[] redisValues = db.ListRange(key);
    }
}

List类型的数据

两种取出所有值方法的对比

A:

while (db.ListLength(key) != 0)
        {
            RedisValue redisValue = db.ListLeftPop(key);
        }
优点
  • 逐个处理元素:适用于需要逐个处理列表元素的情况,每次弹出一个处理,确保处理的元素不再 保留在列表中。
  • 节省内存:一次只处理一个元素,适用于列表非常大且内存有限的情况,不会将整个列表加载到内存中。
缺点
  • 多次网络往返:每次 ListLeftPop 都会与 Redis 服务器通信,对于长列表可能会产生较多的网络请求,导致性能开销。
  • 可能阻塞:如果列表元素处理较慢,会阻塞循环,无法高效地批量处理元素。
    B:
 RedisValue[] redisValues = db.ListRange(key);
优点:
  • 减少网络往返:一次性获取整个列表的所有元素,减少了与 Redis 服务器的通信次数,适用于需要快速获取整个列表内容的情况。
  • 批量处理:可以一次性处理所有元素,适用于批量操作的场景,能够更高效地处理数据。
缺点:
  • 高内存消耗:会将整个列表加载到内存中,适用于列表较小或内存充足的情况。如果列表非常大,可能导致内存溢出。
  • 无删除操作:只是获取列表的副本,不会从 Redis 列表中删除元素,如果需要删除元素还需要额外的操作。

Sorted 类型

using (ConnectionMultiplexer conn = redis.RedisConn)
{
    string keyPrefix = "WHSUS_SortedTest";
    var db = conn.GetDatabase(4);
    if (db.KeyExists(keyPrefix))
    {
        db.KeyDelete(keyPrefix);
    }
    List<UserInfoDto> users = new List<UserInfoDto>();
    for (int i = 0; i < 5; i++)
    {
        UserInfoDto userInfo = new UserInfoDto();
        userInfo.Id = i;
        userInfo.LastLoginTime = DateTime.Now;
        userInfo.Password = "1234789" + i;
        userInfo.StaffId = "7894" + i;
        userInfo.StaffName = "Test" + i;
        users.Add(userInfo);
        db.KeyDelete(keyPrefix + userInfo.Id + ":StaffId");
        db.KeyDelete(keyPrefix + userInfo.Id + ":StaffName");
        db.SortedSetAdd(keyPrefix + userInfo.Id + ":StaffId", userInfo.StaffId, userInfo.Id);
        db.SortedSetAdd(keyPrefix + userInfo.Id + ":StaffName", userInfo.StaffName, userInfo.Id);
    }
        SortedSetEntry? sortedSetEntry = db.SortedSetPop((RedisKey)(keyPrefix + "2:StaffId"));
}

sorted 类型的数据

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值